PageSourceSearch

https://docs.powerwriter.com/assets/js/63af88bb.6b8bc25f.js

js powerwriter.com collected 2026-10-08 00:03:15 UTC 205,548 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[11098],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),l=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},_=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),_=l(n),m=r,f=_["".concat(s,".").concat(m)]||_[m]||d[m]||i;return n?a.createElement(f,o(o({ref:t},p),{},{components:n})):a.createElement(f,o({ref:t},p))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=_;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,o[1]=c;for(var l=2;l<i;l++)o[l]=n[l];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}_.displayName="MDXCreateElement"},95161:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var a=n(87462),r=(n(67294),n(3905));const i={description:"PowerWriter\xae \u901a\u7528\u9ad8\u7ea7\u8f6f\u4ef6\u4fdd\u62a4\u5e93",keywords:["PowerWriter\xae","power writer","icworkshop","docs"],toc_max_heading_level:6},o="5.5\uff1a\u901a\u7528\u4ee3\u7801\u52a0\u5bc6\u5e93",c={unversionedId:"powerwriter_for_arm/application_note/advance_software_protect",id:"powerwriter_for_arm/application_note/advance_software_protect",title:"5.5\uff1a\u901a\u7528\u4ee3\u7801\u52a0\u5bc6\u5e93",description:"PowerWriter\xae \u901a\u7528\u9ad8\u7ea7\u8f6f\u4ef6\u4fdd\u62a4\u5e93",source:"@site/docs/powerwriter_for_arm/05-application_note/05-advance_software_protect.md",sourceDirName:"powerwriter_for_arm/05-application_note",slug:"/powerwriter_for_arm/application_note/advance_software_protect",permalink:"/docs/next/powerwriter_for_arm/application_note/advance_software_protect",draft:!1,editUrl:"https://gitee.com/powerwriter/powerwriter-doc/tree/develop/docs/powerwriter_for_arm/05-application_note/05-advance_software_protect.md",tags:[],version:"current",lastUpdatedBy:"Alan Chen",lastUpdatedAt:1764066748,formattedLastUpdatedAt:"2025\u5e7411\u670825\u65e5",sidebarPosition:5,frontMatter:{description:"PowerWriter\xae \u901a\u7528\u9ad8\u7ea7\u8f6f\u4ef6\u4fdd\u62a4\u5e93",keywords:["PowerWriter\xae","power writer","icworkshop","docs"],toc_max_heading_level:6},sidebar:"docSidebar",previous:{title:"5.4\uff1a\u4e91\u56fa\u4ef6\u7b7e\u540d\u670d\u52a1",permalink:"/docs/next/powerwriter_for_arm/application_note/licenseserver"},next:{title:"5.6\uff1aICWKEY \u6559\u7a0b",permalink:"/docs/next/powerwriter_for_arm/application_note/icwkey"}},s={},l=[{value:"5.5.1\uff1a\u6982\u8ff0",id:"intro",level:2},{value:"5.5.2\uff1a\u51c6\u5907\u5de5\u4f5c",id:"prepare",level:2},{value:"5.5.2.1\uff1a\u57fa\u672c\u8981\u6c42",id:"env",level:3},{value:"5.5.2.2\uff1a\u4e0b\u8f7d\u5730\u5740",id:"download",level:3},{value:"5.5.2.3\uff1a\u6587\u4ef6\u7ed3\u6784",id:"filetree",level:3},{value:"5.5.2.4\uff1a\u6d4b\u8bd5\u73af\u5883",id:"demo_env",level:3},{value:"5.5.3\uff1a\u9879\u76ee\u914d\u7f6e",id:"project_config",level:2},{value:"5.5.3.1\uff1aMDK \u9879\u76ee\u914d\u7f6e",id:"MDK",level:3},{value:"5.5.3.1.1\uff1a\u51c6\u5907\u6d4b\u8bd5\u9879\u76ee",id:"mdk_step1",level:4},{value:"5.5.3.1.2\uff1a\u8c03\u6574\u5806\u6808\u5927\u5c0f",id:"mdk_step2",level:4},{value:"5.5.3.1.3\uff1a\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d",id:"mdk_step3",level:4},{value:"5.5.3.1.4\uff1a\u52a0\u5165lib \u548c source",id:"mdk_step4",level:4},{value:"5.5.3.1.5\uff1a\u52a0\u5165\u547d\u4ee4\u884c",id:"mdk_step5",level:4},{value:"5.5.3.1.6\uff1a\u5176\u4ed6\u8bbe\u7f6e",id:"mdk_step6",level:4},{value:"5.5.3.2\uff1aGCC \u9879\u76ee\u914d\u7f6e",id:"GCC",level:3},{value:"5.5.3.2.1\uff1a\u51c6\u5907\u6d4b\u8bd5\u9879\u76ee",id:"gcc_step1",level:4},{value:"5.5.3.2.2\uff1a\u8c03\u6574\u5806\u6808\u5927\u5c0f",id:"gcc_step2",level:4},{value:"5.5.3.2.3\uff1a\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d",id:"gcc_step3",level:4},{value:"5.5.3.2.4\uff1a\u52a0\u5165lib \u548c source",id:"gcc_step4",level:4},{value:"5.5.3.2.5\uff1a\u52a0\u5165\u547d\u4ee4\u884c",id:"gcc_step5",level:4},{value:"5.5.3.2.6\uff1a\u5176\u4ed6\u8bbe\u7f6e",id:"gcc_step6",level:4},{value:"5.5.3.3\uff1aIAR \u9879\u76ee\u914d\u7f6e",id:"IAR",level:3},{value:"5.5.3.3.1\uff1a\u51c6\u5907\u6d4b\u8bd5\u9879\u76ee",id:"iar_step1",level:4},{value:"5.5.3.3.2\uff1a\u8c03\u6574\u5806\u6808\u5927\u5c0f",id:"iar_step2",level:4},{value:"5.5.3.3.3\uff1a\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d",id:"iar_step3",level:4},{value:"5.5.3.3.4\uff1a\u52a0\u5165lib \u548c source",id:"iar_step4",level:4},{value:"5.5.3.3.5\uff1a\u52a0\u5165\u547d\u4ee4\u884c",id:"iar_step5",level:4},{value:"5.5.3.3.6\uff1a\u5176\u4ed6\u8bbe\u7f6e",id:"iar_step6",level:4},{value:"5.5.4\uff1a\u914d\u7f6e\u4ee5\u53ca\u4f7f\u7528\u6559\u7a0b",id:"usage",level:2}
1,{value:"5.5.4.1\uff1a\u7cfb\u7edf\u914d\u7f6e",id:"config",level:3},{value:"5.5.4.1.1\uff1a\u5185\u5b58\u63a5\u53e3\u914d\u7f6e",id:"config_mem",level:4},{value:"5.5.4.1.2\uff1a\u65e5\u5fd7\u63a5\u53e3\u914d\u7f6e",id:"config_log",level:4},{value:"5.5.4.1.3\uff1a\u52a0\u5bc6\u51fd\u6570loader",id:"config_encrtypt_code",level:4},{value:"5.5.4.2\uff1a\u5bf9\u8c61\u76d1\u63a7",id:"object_watcher",level:3},{value:"5.5.4.2.1\uff1a\u5355\u5bf9\u8c61\u76d1\u63a7",id:"object_watch_sig",level:4},{value:"5.5.4.2.2\uff1a\u52a8\u6001\u5bf9\u8c61\u76d1\u63a7",id:"object_watch_list",level:4},{value:"5.5.4.2.3\uff1a\u8865\u5145\u8bf4\u660e",id:"object_watch_list_note",level:4},{value:"5.5.4.3\uff1a\u56fa\u4ef6\u7b7e\u540d",id:"signature",level:3},{value:"5.5.4.3.1\uff1a\u4f7f\u7528 Matrix \u7b7e\u540d",id:"signature_matrix",level:4},{value:"5.5.4.3.2\uff1a\u4f7f\u7528 ECDSA \u7b7e\u540d",id:"signature_ecdsa",level:4},{value:"5.5.4.3.2\uff1a\u7b7e\u540d\u793a\u4f8b\u5de5\u7a0b",id:"signature_demo",level:4},{value:"5.5.4.4\uff1a\u56fa\u4ef6\u6821\u9a8c",id:"flash_verify",level:3},{value:"5.5.4.5\uff1a\u51fd\u6570\u52a0\u5bc6",id:"code_encryption",level:3},{value:"5.5.4.6\uff1a\u53cd\u8c03\u8bd5\u670d\u52a1",id:"anti_debugger",level:3},{value:"5.5.4.7\uff1a\u6570\u636e\u52a0\u5bc6",id:"data_encryption",level:3},{value:"5.5.4.8\uff1a\u8fd0\u884c\u72b6\u6001\u76d1\u63a7",id:"status",level:3},{value:"5.5.4.9\uff1a\u5176\u4ed6",id:"other",level:3},{value:"5.5.4.2\uff1a\u8c03\u8bd5\u4e0e\u53d1\u5e03",id:"debugging",level:3},{value:"5.5.4.2.1\uff1a\u5de5\u7a0b\u8c03\u8bd5\u65b9\u6cd5",id:"debugging",level:4},{value:"5.5.4.2.2\uff1a\u53d1\u5e03",id:"publish",level:4},{value:"5.5.5\uff1a\u547d\u4ee4\u884c",id:"cli",level:2},{value:"5.5.5.1\uff1a\u53c2\u6570\u8be6\u89e3",id:"cli_param",level:3},{value:"5.5.5.2\uff1aWindows \u6f14\u793a",id:"cli_windows",level:3},{value:"5.5.5.3\uff1aLinux \u6f14\u793a",id:"cli_linux",level:3},{value:"5.5.5.4\uff1aMacOS \u6f14\u793a",id:"cli_MacOS",level:3},{value:"5.5.5.5\uff1a\u4e0eIDE \u8fdb\u884c\u96c6\u6210",id:"cli_IDE",level:3},{value:"5.5.6\uff1a\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf",id:"use_rtos",level:2},{value:"5.5.6.1\uff1a\u4efb\u52a1\u6808\u5206\u914d",id:"rtos_stack",level:3},{value:"5.5.6.2\uff1a\u4efb\u52a1\u5806\u5206\u914d",id:"rtos_stack",level:3},{value:"5.5.6.3\uff1a\u6df7\u5408\u4f7f\u7528",id:"rtos_mix",level:3},{value:"5.5.7\uff1a\u66f4\u591a",id:"feed_back",level:2}],p={toc:l};function d(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"advance_software_protect_lib"},"5.5\uff1a\u901a\u7528\u4ee3\u7801\u52a0\u5bc6\u5e93"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u96c6\u6210\u4ee3\u7801\u52a0\u5bc6\u5e93\u5230\u9879\u76ee\u4e2d\u5e76\u6b63\u786e\u4f7f\u7528\uff0c\u5bf9",(0,r.kt)("strong",{parentName:"p"},"\u5f00\u53d1\u7ecf\u9a8c\u6709\u8f83\u9ad8"),"\u7684\u8981\u6c42\uff0c\u6b64\u5916\uff0c\u8bf7",(0,r.kt)("strong",{parentName:"p"},"\u719f\u8bfb\u672c\u6587\u6863"),"\uff0c\u5e76",(0,r.kt)("strong",{parentName:"p"},"\u6309\u7167\u6d41\u7a0b"),"\u8fdb\u884c\u64cd\u4f5c\uff0c\u672c\u6587\u6863\u5c06\u5c3d\u53ef\u80fd\u5c06\u7ec6\u8282\u9610\u8ff0\u6e05\u6670\uff0c\u4ee5\u4fbf\u51cf\u5c11\u51fa\u73b0\u95ee\u9898\u7684\u53ef\u80fd\u6027\u3002")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\u5f53\u524d\u5e93\u6587\u4ef6\u548cdemo \u63d0\u4f9b",(0,r.kt)("strong",{parentName:"p"},"\u5168\u529f\u80fd\u7684\u7248\u672c")," \u4ee5\u53ca ",(0,r.kt)("strong",{parentName:"p"},"\u7cbe\u7b80\u7248\u672c\uff08\u8d44\u6e90\u5360\u7528\u7387\u4f4e\uff1a\u6700\u4f4e\u4ec5\u9700 1K Flash & 1K SRAM\uff09"),"\uff0c\u5927\u90e8\u5206\u52a0\u5bc6\u7b97\u6cd5\uff0c\u6821\u9a8c\u7b97\u6cd5\u7b49\u5747\u4e3a\u5185\u7f6e\u7b97\u6cd5\uff0c\u5982\u679c\u5bf9\u9879\u76ee\u6709\u66f4\u9ad8\u7684\u8981\u6c42\uff0c\u5982\u66ff\u6362\u5185\u90e8\u7684\u6821\u9a8c\u7b97\u6cd5\uff0c\u6570\u636e\u52a0\u5bc6\u7b97\u6cd5\uff0c\u6216\u8005\u8c03\u6574\u5176\u4ed6\u6a21\u5757\u3001\u79fb\u690d\u5230\u4e0d\u540c\u7684\u7f16\u8bd1\u5668\u3001\u6216\u8005\u57fa\u4e8e\u66f4\u9ad8\u5b9a\u5236\u8981\u6c42\uff0c\u8bf7\u90ae\u4ef6\u53cd\u9988\u81f3\u5ba2\u6237\u670d\u52a1\u90ae\u7bb1 ",(0,r.kt)("a",{parentName:"p",href:"mailto:[email protected]"}
1,"[email protected]")," \u3001\u5ba2\u670d\u3001\u5e02\u573a\u4eba\u5458\u7b49\uff0c\u5177\u4f53\u8bf7\u67e5\u9605\u7f51\u7ad9\u9996\u9875\u7684\u8054\u7cfb\u65b9\u5f0f \u3002")),(0,r.kt)("h2",{id:"intro"},"5.5.1\uff1a\u6982\u8ff0"),(0,r.kt)("p",null,"Power Writer \u5185\u7f6e\u4e86\u6807\u51c6\u7684Matrix \u7b7e\u540d\u7b97\u6cd5, \u4ee5\u53ca\u53ef\u914d\u5408 ICWKEY \u6765\u505a\u82af\u7247\u7684\u6570\u5b57\u8bc1\u4e66\u5206\u53d1\uff0c \u5728\u4e00\u4e9b\u57fa\u7840\u5e94\u7528\u4e2d\uff0c\u53ef\u5b9e\u73b0\u9632\u6b62\u4e8c\u8fdb\u5236\u4ee3\u7801\u7684\u9632\u62f7\u8d1d\u7684\u8981\u6c42\uff0c\u4f46\u968f\u7740\u8f6f\u4ef6\u4fdd\u62a4\u7ea7\u522b\u8981\u6c42\u7684\u63d0\u9ad8\uff0c\u7528\u6237\u6709\u66f4\u6df1\u4e00\u5c42\u7684\u8f6f\u4ef6\u4fdd\u62a4\u7684\u9700\u6c42\uff0c\u4e3a\u6b64\uff0c\u521b\u82af\u5de5\u574a\u5c06\u81ea\u8eab\u4ea7\u54c1\u4f7f\u7528\u7684\u52a0\u5bc6\u5e93\u90e8\u5206\u529f\u80fd\u4ee5 \u5e93\u6587\u4ef6(Library) \u7684\u5f62\u5f0f\u8fdb\u884c\u5f00\u653e\uff0c\u4ee5\u4fbf\u6ee1\u8db3\u66f4\u9ad8\u9636\u7684\u4ee3\u7801\u52a0\u5bc6\u9632\u62a4\u9700\u6c42\uff0c\u5f53\u524d\u52a0\u5bc6\u5e93\u5305\u542b\u4ee5\u4e0b\u6a21\u5757\uff1a"),(0,r.kt)("p",null,"MCU\u901a\u7528\u8f6f\u4ef6\u4fdd\u62a4\u5e93 (",(0,r.kt)("strong",{parentName:"p"},"advance_software_protect_library)")," \u53ef\u63d0\u4f9b"),(0,r.kt)("ul",{className:"contains-task-list"},(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u5bf9\u8c61\u76d1\u63a7\uff08\u76d1\u63a7\u5bf9\u8c61\u662f\u5426\u88ab\u975e\u6cd5\u8bbf\u95ee\uff09"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u56fa\u4ef6\u6821\u9a8c\uff08\u652f\u6301\u5206\u533a\u6bb5\u6821\u9a8c\uff0c\u7528\u6237\u53ef\u81ea\u7531\u8bbe\u7f6e\u6821\u9a8c\u533a\u57df\uff09"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u51fd\u6570\u52a0\u5bc6\uff08\u90e8\u5206\u56fa\u4ef6\u52a0\u5bc6\uff0c\u51fd\u6570\u7ea7\u52a0\u5bc6\uff0c\u907f\u514d\u6838\u5fc3\u4ee3\u7801\u6cc4\u9732\uff09"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u53cd\u8c03\u8bd5\u670d\u52a1\u6846\u67b6"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u56fa\u4ef6\u7b7e\u540d\uff08\u9632\u6b62\u56fa\u4ef6\u88ab\u62f7\u8d1d\u5230\u5176\u4ed6\u82af\u7247\uff09"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","\u56fa\u4ef6\u538b\u7f29\uff08\u538b\u7f29\u90e8\u5206\u4e8c\u8fdb\u5236\u4ee3\u7801\uff09"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!1,disabled:!0})," ","\u865a\u62df\u673a\uff08ARM \u6307\u4ee4\u96c6\u8f6c\u5316\u4e3aARM\u865a\u62df\u673a\u6307\u4ee4\uff09"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u5176\u4ed6\u5b89\u5168\u670d\u52a1")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\u56fa\u4ef6\u538b\u7f29\u3001\u865a\u62df\u673a\u7b49\u6280\u672f\u5f53\u524d\u5c5e\u4e8e",(0,r.kt)("strong",{parentName:"p"},"\u4fdd\u5bc6\u6280\u672f"),"\uff0c\u6682\u4e0d\u8fdb\u884c\u516c\u5f00\uff0c\u5f53\u524d\u5df2\u5f00\u653e\u7684\u6280\u672f\uff0c\u53ef\u6ee1\u8db3\u7edd\u5927\u90e8\u95e8\u5e94\u7528\u573a\u666f\uff0c\u5982\u679c\u5bf9\u52a0\u5bc6\u6709\u5ba2\u5236\u5316\u7684\u9700\u6c42\uff0c\u53ef\u4e0e\u6211\u4eec\u53d6\u5f97\u8054\u7cfb\uff0c\u90ae\u7bb1\uff1a",(0,r.kt)("a",{parentName:"p",href:"mailto:[email protected]"},"[email protected]")," \u3002")),(0,r.kt)("h2",{id:"prepare"},"5.5.2\uff1a\u51c6\u5907\u5de5\u4f5c"),(0,r.kt)("h3",{id:"env"},"5.5.2.1\uff1a\u57fa\u672c\u8981\u6c42"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u652f\u6301\u7684\u64cd\u4f5c\u7cfb\u7edf\uff1awindows \u3001Linux\u3001MacOS\u3002"),(0,r.kt)("li",{parentName:"ul"},"\u652f\u6301\u7684\u7f16\u8bd1\u5668\uff08\u5f00\u53d1\u73af\u5883\uff09\uff1a",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"ARMCC\uff08Clang\uff09"),"\uff1a\u5178\u578b\u7684IDE \u4e3a MDK\uff0c\u5fc5\u987b\u5f00\u542fC99 \u6a21\u5f0f\u3002"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"GCC\uff1a"),"\u5178\u578b\u7684IDE \u4e3a Eclipse CDT \u5f00\u53d1\u73af\u5883\uff0c\u6bd4\u5982 STM32 Cube IDE\u3001\u6216\u8005\u57fa\u4e8e VSCode + GCC + GDB \u7ec4\u5408\u73af\u5883\u3002"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"IAR\uff1a"),"IAR Embedded Workbench IDE\u3002"))),(0,r.kt)("li",{parentName:"ul"},"\u5f00\u542f\u5168\u529f\u80fd\u65f6\u7684\u6700\u5c0fFlash \u5927\u5c0f\uff1a> ",(0,r.kt)("strong",{parentName:"li"},"4.8K")," Byte\uff08\u5806\u5927\u5c0f\uff09\u3002"),(0,r.kt)("li",{parentName:"ul"},"\u5f00\u542f\u5168\u529f\u80fd\u65f6\u7684\u6700\u5c0fFlash \u5927\u5c0f \uff1a> ",(0,r.kt)("strong",{parentName:"li"},"46K")," Byte\u3002"),(0,r.kt)("li",{parentName:"ul"},"\u652f\u6301\u7684CPU \u4f53\u7cfb\uff1aARM Cortex \u7cfb\u5217 CPU\u3002")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"\u4e0b\u8f7d\u7ad9\u5c06\u6839\u636e\u9700\u6c42\u53cd\u9988\uff0c\u63d0\u4f9b\u6700\u65b0\u7684\u5e93\u6587\u4ef6\u3001\u4f9d\u8d56\u6e90\u7801\u3001\u793a\u4f8b\u6e90\u7801\u7b49\u3002"),(0,r.kt)("li",{parentName:"ul"},"ARM \u5185\u6838\u4ee5\u5916\u7684\u5176\u4ed6\u6307\u4ee4\u96c6\uff08\u5982RISC-V\uff09 \u3001\u652f\u6301\u5217\u8868\u4e4b\u5916\u7684\u5176\u4ed6\u7f16\u8bd1\u5668\u5f53\u524d\u65e0\u8ba1\u5212\u8fdb\u884c\u79fb\u690d\uff0c\u5982\u6709\u6b64\u9700\u6c42\uff0c\u8bf7\u53cd\u9988\u7ed9\u6211\u4eec\u3002"))),(0,r.kt)("h3",{id:"download"},"5.5.2.2\uff1a\u4e0b\u8f7d\u5730\u5740"),(0,r.kt)("p",null,"\u70b9\u51fb\u5982\u4e0b\u8fde\u
163a5\u8fdb\u5165\u5230 Power Writer \u4e0b\u8f7d\u4e2d\u5fc3\uff0c",(0,r.kt)("a",{parentName:"p",href:"https://www.PowerWriter.com/index/index/products?p=2&c=files&t=Others"},"PowerWriter\xae \u4e0b\u8f7d\u4e2d\u5fc3"),"\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u70b9\u51fb \u3010",(0,r.kt)("strong",{parentName:"p"},"\u7acb\u523b\u4e0b\u8f7d"),"\u3011\u5c06\u52a0\u5bc6\u5e93\u4ee5\u53ca\u76f8\u5173\u6587\u4ef6\u4e0b\u8f7d\u5230\u672c\u6b21\u78c1\u76d8\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250109174809242",src:n(92665).Z,width:"1126",height:"465"})),(0,r.kt)("h3",{id:"filetree"},"5.5.2.3\uff1a\u6587\u4ef6\u7ed3\u6784"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u6587\u4ef6\u7ed3\u6784\u968f\u7740\u5e93\u7684\u66f4\u65b0\u53ef\u80fd\u4f1a\u6709\u53d8\u5316\uff0c\u4e0d\u4f1a\u518d\u989d\u5916\u8fdb\u884c\u8bf4\u660e\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"\u251c\u2500\u2500 Docs.url        /* \u5728\u7ebf\u6587\u6863 */\n\u251c\u2500\u2500 ico.png\n\u251c\u2500\u2500 project         /* \u52a0\u5bc6\u5e93 library \u4ee5\u53ca\u76f8\u5173 Demo */\n\u2502\xa0\xa0 \u251c\u2500\u2500 lib         /* \u52a0\u5bc6\u5e93 library */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 advance_software_protect_base.h     /* \u57fa\u7840\u5934\u6587\u4ef6\u5b9a\u4e49 */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 advance_software_protect_lib.h      /* \u5bfc\u51fa\u51fd\u6570\u58f0\u660e */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 advance_software_protect_porting.c  /* \u7528\u6237\u79fb\u690d\u63a5\u53e3 */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 advance_software_protect_samples.c  /* \u793a\u4f8b\u6559\u7a0b */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 advance_software_protect_user.h     /* \u7528\u6237\u79fb\u690d\u4ee5\u53ca\u81ea\u5b9a\u4e49\u53c2\u6570 */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 gcc     /* GCC \u5e93\u6587\u4ef6 */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 iar     /* IAR \u5e93\u6587\u4ef6 */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u2514\u2500\u2500 mdk     /* ARMCC \u5e93\u6587\u4ef6 */\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m0.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m0plus.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m0plus_mpu.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m1.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m23.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m23_tz.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m3.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m33.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m33_dsp_fp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m33_dsp_fp_tz.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m33_tz.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m35plus.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m35plus_dsp_fp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m35plus_dsp_fp_tz.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m35plus_tz.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m4.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m4_fp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m55.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m7.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m7_dp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_m7_sp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_softw
1are_protect_m85.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_sc000.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_sc300.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v81mml_dsp_dp_mve_fp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_bl.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_mml.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_mml_dp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_mml_dsp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_mml_dsp_dp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_mml_dsp_sp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u251c\u2500\u2500 advance_software_protect_v8m_mml_sp.lib\n\u2502\xa0\xa0 \u2502\xa0\xa0     \u2514\u2500\u2500 devices_list\n\u2502\xa0\xa0 \u2514\u2500\u2500 mdk_demo    /* MDK demo */\n\u2502\xa0\xa0     \u2514\u2500\u2500 stm32f103rfc6\n\u2502\xa0\xa0         \u251c\u2500\u2500 Core\n\u2502\xa0\xa0         \u251c\u2500\u2500 Drivers\n\u2502\xa0\xa0         \u251c\u2500\u2500 
1EWARM\n\u2502\xa0\xa0         \u251c\u2500\u2500 MDK-ARM\n\u2502\xa0\xa0         \u2514\u2500\u2500 stm32f103rfc6.ioc\n\u251c\u2500\u2500 sample  /* PowerWriter\xae \u7cfb\u5217\u4ea7\u54c1\uff0c\u793a\u4f8b\u5de5\u7a0b  */\n\u2502\xa0\xa0 \u251c\u2500\u2500 STM32F103rf_ecdsa.pkg   /* \u52a0\u5bc6\u5e93\u4f7f\u7528 ecdsa \u7b7e\u540d\u7b97\u6cd5\u793a\u4f8b\u5de5\u7a0b */\n\u2502\xa0\xa0 \u251c\u2500\u2500 STM32F103rf_matrix.pkg  /* \u52a0\u5bc6\u5e93\u4f7f\u7528 matrix \u7b7e\u540d\u7b97\u6cd5\u793a\u4f8b\u5de5\u7a0b */\n\u2502\xa0\xa0 \u251c\u2500\u2500 ecdsa   /* ICWKEY \u5de5\u7a0b\uff0c\u4ee5\u53ca\u5bfc\u51fa\u516c\u94a5\u4fe1\u606f */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 SafeLic_53ECCC98.uprj   /* ICWKEY \u793a\u4f8b\u5de5\u7a0b */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 password.txt    /* ICWKEY \u793a\u4f8b\u5de5\u7a0b\u5bc6\u7801\u4fe1\u606f */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 cortex_chipid_binding.c /* ICWKEY \u793a\u4f8b\u5de5\u7a0b\uff0c\u5bfc\u51fa\u6e90\u7801\u4fe1\u606f */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u2514\u2500\u2500 cortex_chipid_binding.h /* ICWKEY \u793a\u4f8b\u5de5\u7a0b\uff0c\u5bfc\u51fa\u5934\u6587\u4ef6\u4fe1\u606f */\n\u2502\xa0\xa0 \u251c\u2500\u2500 matrix  /* \u4f7f\u7528Matrix \u5bfc\u51fa\u793a\u4f8b\u5de5\u7a0b */\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 DebugConfig \n\u2502\xa0\xa0 \u2502\xa0\xa0 \u2502\xa0\xa0 \u2514\u2500\u2500 STM32F10xSample_STM32F103RG_1.0.0.dbgconf\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 Listings\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 Objects\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 UidSample.uvguix.CSHSOFT\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 UidSample.uvoptx\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 UidSample.uvprojx\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 cortex_chipid_binding.c\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 cortex_chipid_binding.h\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u251c\u2500\u2500 main.c\n\u2502\xa0\xa0 \u2502\xa0\xa0 \u2514\u2500\u2500 startup_stm32f10x_hd.s\n\u2502\xa0\xa0 \u2514\u2500\u2500 password.txt    /* PowerWriter\xae \u793a\u4f8b\u5de5\u7a0b\u5bc6\u7801\u8bf4\u660e */\n\u2514\u2500\u2500 tool\n    \u251c\u2500\u2500 linux\n    \u2502\xa0\xa0 \u2514\u2500\u2500 advance_software_protect    /* \u52a0\u5bc6\u5e93Linux \u547d\u4ee4\u884c */\n    \u251c\u2500\u2500 macos\n    \u2502\xa0\xa0 \u2514\u2500\u2500 advance_software_protect    /* \u52a0\u5bc6\u5e93 Macos \u547d\u4ee4\u884c */\n    \u2514\u2500\u2500 windows\n        \u2514\u2500\u2500 advance_software_protect.exe    /* \u52a0\u5bc6\u5e93 Windows \u547d\u4ee4\u884c */\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u5728\u5b9e\u9645\u9879\u76ee\u4f7f\u7528\u4e2d\uff0c\u8bf7\u4e0d\u8981\u4fee\u6539 advance_software_protect_base.h \u548c advance_software_protect_lib.h \u4e24\u4e2a\u6e90\u6587\u4ef6\u4e2d\u7684\u4efb\u4f55\u5b9a\u4e49\uff0c\u8fd9\u4e24\u4e2a\u6587\u4ef6\u5747\u4e3a\u52a0\u5bc6\u5e93\u57fa\u7840\u5b9a\u4e49\u5185\u5bb9\u3002")),(0,r.kt)("h3",{id:"demo_env"},"5.5.2.4\uff1a\u6d4b\u8bd5\u73af\u5883"),(0,r.kt)("ul",{className:"contains-task-list"},(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u76ee\u6807\u6d4b\u8bd5\u677f\u4f7f\u7528 STM32F103RFT6 \u6838\u5fc3\u677f\u4f5c\u4e3a\u6d4b\u8bd5\u677f\uff0c\u5982\u4f7f\u7528\u5176\u4ed6\u7cfb\u7edf\u677f\uff0c\u53c2\u8003\u73af\u5883\u642d\u5efa\uff0c\u8fdb\u884c\u914d\u7f6e\u3002"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u76ee\u6807\u677f\u91c7\u7528 HSI \u65f6\u949f\u6e90\uff0c\u7cfb\u7edf\u6700\u9ad8\u65f6\u949f 64Mhz\u3002"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u4f7f\u7528 PC13 LED \u4f5c\u4e3a\u7cfb\u7edf\u6307\u793a\u5668\u3002"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u4f7f\u7528 USART 1\uff08PA9 \u3001PA10\uff09\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u63a5\u53e3\u3002"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u5f00\u542f SWD \u8c03\u8bd5\uff08PA13\u3001PA14\uff09\u3002"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","BOOT0 \u4e0b\u62c9\u7535\u963b\u5230 GND\uff0c\u4eceMain Flash \u542f\u52a8\u3002"),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("input",{parentName:"li",type:"checkbox",checked:!0,disabled:!0})," ","\u8c03\u8bd5\u5de5\u5177\uff0c\u4e32\u53e3\u5de5\u5177\uff0c\u7f16\u7a0b\u5de5\u5177\u5747\u4e3a Power Writer\uff0cECDSA \u7b7e\u540d\u7b97\u6cd5\u4f7f\u7528 ICWKEY\u3002")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\u5f53\u524d\u52a0\u5bc6\u5e93\u53ef\u4ee5\u5728\u6240\u6709\u7684 ",(0,r.kt)("strong",{parentName:"p"},"ARM Cortex -M")," \u82af\u7247\u4e0a\u8fdb\u884c\u4f7f\u7528\uff0c\u4f46\u662f\u63a8\u4ecb\u5728 ",(0,r.kt)("strong",{parentName:"p"},"Flash >128K Byte"),"\u3001",(0,r.kt)("strong",{parentName:"p"},"SRAM > 48K")," \u3001\u5e76\u4e14\u6709\u8db3\u591f\u7684\u5269\u4f59\u5b58\u50a8\u7a7a\u95f4\u7684\u9879\u76ee\u4e0a\u8fdb\u884c\u4f7f\u7528\u3002")),(0,r.kt)("h2",{id:"project_config"},"5.5.3\uff1a\u9879\u76ee\u914d\u7f6e"),(0,r.kt)("h3",{id:"MDK"},"5.5.3.1\uff1aMDK \u9879\u76ee\u914d\u7f6e"),(0,r.kt)("h4",{id:"mdk_step1"},"5.5.3.1.1\uff1a\u51c6\u5907\u6d4b\u8bd5\u9879\u76ee"),(0,r.kt)("p",null,"\u6309\u7167Demo \u7684\u8981\u6c42\uff0c\u51c6\u5907LED \u6307\u793a\u706f\uff0c\u5f53\u524d\u4f7f\u7528PC13\u4f5c\u4e3a\u6307\u793a\u5668\uff0c\u7528\u4e8e\u9a8c\u8bc1\uff0c\u5f00\u542fSWD \u8c03\u8bd5\u63a5\u53e3\uff0c\u5e76\u914d\u7f6e USART1 \uff0c\u914d\u7f6e\u7cfb\u7edf\u65f6\u949f\u4e3a 64Mhz \uff0c\u51c6\u5907\u5b8c\u6210\u540e\uff0c\u751f\u6210Demo \u4ee3\u7801\uff0c\u5982\u4e0b\u56fe\u6240\u793a\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112625465",src:n(77048).Z,width:"854",height:"660"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112810711",src:n(27059).Z,width:"1112",height:"658"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112837043",src:n(10563).Z,width:"662",he
1ight:"269"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112932329",src:n(99118).Z,width:"1069",height:"325"})),(0,r.kt)("h4",{id:"mdk_step2"},"5.5.3.1.2\uff1a\u8c03\u6574\u5806\u6808\u5927\u5c0f"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u4f1a\u4f7f\u7528\u52a8\u6001\u5185\u5b58\u5206\u914d\u6765\u5206\u914d\u5185\u90e8\u8d44\u6e90\uff0c\u5728\u8fdb\u884c\u7b7e\u540d\u8fd0\u7b97\u65f6\uff0c\u7531\u4e8e\u8c03\u7528\u5c42\u6570\u8f83\u6df1\uff0c\u53ef\u80fd\u4e5f\u9700\u8981\u9002\u5f53\u7684\u8fdb\u884c\u6808\u5927\u5c0f\u7684\u8c03\u6574\uff0c\u5f53\u524d\u9879\u76ee\u7684\u5806\u6808\u914d\u7f6e\u6587\u4ef6\u4e3a startup_stm32f103xg.s\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-assembly"},"Stack_Size      EQU     0x400           ;\u5f53\u524d\u7684\u6808\u7a7a\u95f4\u5927\u5c0f\uff0c\u5982\u679c\u4e0d\u591f\uff0c\u53ef\u9002\u5f53\u589e\u52a0\n\n                AREA    STACK, NOINIT, READWRITE, ALIGN=3\nStack_Mem       SPACE   Stack_Size\n__initial_sp\n                                                  \n; <h> Heap Configuration\n;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>\n; </h>\n\nHeap_Size      EQU     0x2000       ;\u5f53\u524d\u9879\u76ee\u7684\u5806\u5927\u5c0f\uff0c\u8fd9\u91cc\u8bbe\u7f6e\u4e3a 0x2000\n\n                AREA    HEAP, NOINIT, READWRITE, ALIGN=3\n__heap_base\nHeap_Mem        SPACE   Heap_Size\n__heap_limit\n\n                PRESERVE8\n                THUMB\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5bc6\u5e93\u4f7f\u7528 ECDSA \u7b7e\u540d\u65f6\uff0c\u6700\u4f4e\u9700\u8981 5K \u4ee5\u4e0a\u7684 \u52a8\u6001\u5185\u5b58\uff0c\u5728\u989d\u5916\u52a0\u4e0a\u52a0\u5bc6\u5e93\u672c\u8eab\uff0c\u81f3\u5c11\u9884\u75596K \u4ee5\u4e0a\uff0c\u9700\u8981\u5728\u5b9e\u9645\u4f7f\u7528\u9879\u76ee\u5806\u914d\u7f6e\u7684\u57fa\u7840\u4e0a\uff0c\u518d\u589e\u52a06K \u4ee5\u4e0a\u7684\u5806\u5206\u914d\uff0c\u5982\u679c\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf\uff0c\u5219\u9700\u8981\u914d\u7f6e\u5e93\u7684\u5185\u5b58\u7ba1\u7406\u63a5\u53e3\u56de\u8c03\uff0c\u8be6\u89c1\u540e\u7eed\u7ae0\u8282\u3002")),(0,r.kt)("h4",{id:"mdk_step3"},"5.5.3.1.3\uff1a\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u5c06\u4f7f\u7528\u90e8\u5206\u7684 SRAM \u4f5c\u4e3a\u4ee3\u7801\u6267\u884c\u7f13\u51b2\u533a\uff0c\u6240\u4ee5\uff0c\u9879\u76ee\u5728\u539f\u6765\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u8fdb\u884c\u989d\u5916\u7684\u8c03\u6574\uff0c\u5c06Flash\u5b9e\u9645\u7528\u91cf\u8c03\u5c0f\uff0c\u5c06SRAM \u8fdb\u884c\u8c03\u6574\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u8c03\u6574\u8d44\u6e90\u7684\u76ee\u7684\u662f\u5c06\u90e8\u5206SRAM\uff08\u5f53\u524d\u4e3a 4K\uff09\u4f5c\u4e3a\u52a0\u5bc6\u5e93\u7f13\u51b2\u533a\u4f7f\u7528\uff0c\u540c\u65f6\u5bf9\u5e94\u7684FLASH \u5bb9\u91cf\u9700\u8981\u51cf\u5c0f\u5bf9\u5e94\u7684\u5bb9\u91cf\uff0c\u7528\u4e8e\u5b58\u653e\u52a0\u5bc6\u6570\u636e\uff0c\u8c03\u6574\u540e\u7684\u6574\u4f53\u4ee3\u7801\u7a7a\u95f4\u4e0d\u53d8\uff0c\u5185\u5b58\u51cf\u5c11\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"#\u8c03\u6574\u524d Flash / SRAM \u914d\u7f6e\u4fe1\u606f                                      \nIROM1\uff1a0x08000000 0xC0000                                SRAM\uff1a0x20000000 0x18000\n\n#\u8c03\u6574\u540e Flash / SRAM \u914d\u7f6e\u4fe1\u606f                                      \nIROM1\uff1a0x08000000 0xC0000                                SRAM\uff1a0x20000000 0x17000\nIROM2\uff1a0x20017000 0X1000                                             \n")),(0,r.kt)("p",null,"\u8c03\u6574\u524d\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110134114284",src:n(68387).Z,width:"569",height:"53"})),(0,r.kt)("p",null,"\u8c03\u6574\u540e\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110134036812",src:n(83936).Z,width:"615",height:"78"})),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u56de\u5230\u5de5\u7a0b\u8bbe\u7f6e\u4e2d\uff0c\u5207\u6362\u5230 Linker \u8bbe\u7f6e\uff0c\u53d6\u6d88\u52fe\u9009 \u2018Use Memory Layout from Target Dialog\u2019 \u9009\u9879\uff0c\u4f7f\u7528\u81ea\u5b9a\u4e49 Scatter File \u6587\u4ef6\uff0c\u70b9\u51fb\u7f16\u8f91\u6309\u94ae\uff0c\u8fdb\u5165\u7f16\u8f91\u6a21\u5f0f\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110134742280",src:n(43841).Z,width:"626",height:"470"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-assembly"},"; *************************************************************\n; *** Scatter-Loading Description File generated by uVision ***\n; *************************************************************\n\nLR_IROM1 0x08000000 0x000BF000  {    ; load region size_region\n  ER_IROM1 0x08000000 0x000BF000 {  ; load address = execution address\n   *.o (RESET, +First)\n   *(InRoot$$Sections)\n   .ANY 
1(+RO)\n   .ANY (+XO)\n  }\n  RW_IRAM1 0x20000000 0x00017000  {  ; RW data\n   .ANY (+RW +ZI)\n  }\n}\n\nLR_IROM2 0x20017000 0x00001000  {\n  ER_IROM2 0x20017000 0x00001000  {  ; load address = execution address\n   .ANY (+RO)\n   .ANY (.advance_software_protect_encryption_section)  ; \u5728 LR_ROM2 \u540e\u9762\u8ffd\u52a0\u5f53\u524d\u5b9a\u4e49\u3002\n  }\n}\n")),(0,r.kt)("h4",{id:"mdk_step4"},"5.5.3.1.4\uff1a\u52a0\u5165lib \u548c source"),(0,r.kt)("p",null,"\u5728\u538b\u7f29\u5305\u4e2dlib \u76ee\u5f55\uff0c\u627e\u5230\u5bf9\u5e94\u7684\u57fa\u7840\u6e90\u7801\uff0c\u76f8\u5173\u5e93\u6587\u4ef6\uff0c\u6dfb\u52a0\u5230\u5de5\u7a0b\u4e2d\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110153831028",src:n(41377).Z,width:"675",height:"218"})),(0,r.kt)("p",null,"\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u5de5\u7a0b\u7ed3\u6784\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110153912982",src:n(44950).Z,width:"386",height:"377"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u8bf7\u6839\u636e\u82af\u7247\u7684\u5185\u6838\u7248\u672c\uff0c\u6dfb\u52a0\u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\uff0c\u5f53\u524d\u5b9e\u4f8b\u5de5\u7a0b\u4e3a STM32F103RFT6\uff0c\u5185\u6838\u4e3a ARM Cortex M3 \u5185\u6838\u3002")),(0,r.kt)("h4",{id:"mdk_step5"},"5.5.3.1.5\uff1a\u52a0\u5165\u547d\u4ee4\u884c"),(0,r.kt)("p",null,"MDK \u7f16\u8bd1\u7684\u56fa\u4ef6\u4e3a\u539f\u59cb\u7684\u56fa\u4ef6\uff0c\u5982\u4e0d\u7ecf\u8fc7\u547d\u4ee4\u884c\u8fdb\u884c\u5904\u7406\uff0c\u4f1a\u5bfc\u81f4\u76f8\u5173\u529f\u80fd\u6ca1\u6709\u5f00\u542f\uff0c\u5e76\u4e14\u5728\u5b9e\u9645\u4ea7\u54c1\u4e2d\uff0c\u53ef\u80fd\u65e0\u6cd5\u8fd0\u884c\uff0c\u56e0\u4e3a\uff0c\u6211\u4eec\u9700\u8981\u5c06\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u6dfb\u52a0\u5230\u5de5\u7a0b\u914d\u7f6e\u4e2d\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("ul",{className:"contains-task-list"},(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("input",{parentName:"p",type:"checkbox",checked:!0,disabled:!0})," ","RUN #1\uff0c\u6211\u4eec\u5c06 axf \u6587\u4ef6\u8f93\u51fabin \u6587\u4ef6\uff0c\u4f7f\u7528\u547d\u4ee4\u4e3a\uff1a"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'fromelf --bin -o "[email protected]" "#L"\n'))),(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("input",{parentName:"p",type:"checkbox",checked:!0,disabled:!0})," ","RUN#2\uff0c\u6211\u4eec\u5c06\u7b2c\u4e00\u6b65\u8f93\u51fa\u7684 bin \u6587\u4ef6\uff0c\u751f\u6210\u6700\u7ec8\u7528\u4e8e\u751f\u4ea7\u7684\u56fa\u4ef6\uff0c\u4f7f\u7528\u7684\u547d\u4ee4\u4e3a\uff1a"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"../../../../tool/windows/advance_software_protect.exe \n-s 0x08000000           #-s \u8868\u793aFlash \u56fa\u4ef6\u7684\u8d77\u59cb\u5730\u5740\u4e3a 0x08000000\n-k 0xfb90ffcb9b62c2e6   #-k \u8868\u793a\u52a0\u5bc6\u7684\u5bc6\u7801\uff0c\u957f\u5ea6\u4e3a8 \u5b57\u8282\uff0c\u5fc5\u987b\u548c\u6e90\u7801\u8fdb\u884c\u5bf9\u5e94\uff0c\u6bcf\u4e00\u4e2a\u9879\u76ee\u5fc5\u987b\u66f4\u6539\uff0c\u907f\u514d\u548c\u522b\u4eba\u7684\u9879\u76ee\u91c7\u7528\u4e00\u6837\u7684\u5bc6\u7801\n-i ./stm32f103rfc6/stm32f103rfc6.bin/ER_IROM1 #-i \u5bfc\u5165\u4e3bFlash \u56fa\u4ef6 \n-r ./stm32f103rfc6/stm32f103rfc6.bin/ER_IROM2 #-r \u5bfc\u5165SRAM \u56fa\u4ef6\n")))),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110154444006",src:n(69845).Z,width:"1204",height:"470"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u6bcf\u4e00\u4e2a\u9879\u76ee\u7684 -k\uff0c\u4e5f\u5c31\u662f\u52a0\u5bc6\u5bc6\u7801\uff0c\u5fc5\u987b\u968f\u673a\u751f\u6210 8\u5b57\u8282\uff0c\u907f\u514d\u91c7\u7528\u516c\u7528\u7684\u5bc6\u7801\uff0c\u4ee5\u63d0\u9ad8\u5b89\u5168\u6027\u3002"),(0,r.kt)("p",{parentName:"admonition"},"\u66f4\u591a\u5173\u4e8e\u547d\u4ee4\u884c\u7684\u7528\u6cd5\uff0c\u8bf7\u53c2\u8003 ",(0,r.kt)("a",{parentName:"p",href:"#cli"},"\u547d\u4ee4\u884c")," \u7ae0\u8282\u3002")),(0,r.kt)("h4",{id:"mdk_step6"},"5.5.3.1.6\uff1a\u5176\u4ed6\u8bbe\u7f6e"),(0,r.kt)("p",null,"\u4e3a\u4e86\u907f\u514d\u51fa\u73b0\u7f16\u8bd1\u95ee\u9898\uff0c\u5efa\u8bae\u5f00\u542fC99 \u6a21\u5f0f\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110155403040",src:n(15549).Z,width:"626",height:"470"})),(0,r.kt)("p",null,"\u5f53\u524d\u8c03\u8bd5\u5668\u91c7\u7528PowerWriter\xae \u81ea\u5e26\u7684\u8c03\u8bd5\u5668\uff0c\u4f7f\u7528\u65b9\u6cd5\uff0c\u8bf7\u53c2\u8003\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://docs.PowerWriter.com/docs/next/faq/PowerWriter/base/Debugger"},"3.1.7\uff1a\u8c03\u8bd5\u5668\u4f7f\u7528\u6559\u7a0b | PowerWriter\xae\u6587\u6863\u4e2d\u5fc3"),"\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u8fdb\u884c\u5f00\u53d1\u5f53\u4e2d\uff0c\u7531\u4e8e\u4e0d\u9700\u8981MDK \u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0c\u6240\u4ee5\uff0c\u9700\u8981\u5c06\u8c03\u8bd5\u5668\u7684\u7f16\u7a0b\uff0c\u6821\u9a8c\u529f\u80fd\u8fdb\u884c\u5173\u95ed\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110155834520",src:n(67081).Z,width:"644",height:"120"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110155623028",src:n(87471).Z,width:"623",he
1ight:"401"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u4f9d\u7136\u53ef\u4ee5\u8fdb\u884c\u9879\u76ee\u7684\u8c03\u8bd5\uff0c\u4f46\u662f\u4e0b\u8f7d\u91c7\u7528PowerWriter\xae \u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0cMDK \u4e0d\u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0c\u4ee5\u4fbf\u9a8c\u8bc1\u6700\u7ec8\u7684\u6548\u679c\u3002")),(0,r.kt)("p",null,"\u5f53\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u53ef\u80fd\u4f1a\u5b58\u5728\u4ee3\u7801\u8fd0\u884c\u4e4b\u540e\uff0c\u5173\u95ed\u8c03\u8bd5\u5668\uff0c\u5e76\u5f00\u542f\u8bfb\u4fdd\u62a4\uff0c\u5c06\u5bfc\u81f4\u8c03\u8bd5\u529f\u80fd\u65ad\u7ebf\uff0c\u56e0\u4e3a\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u505a\u4e24\u4e2a\u5de5\u7a0b\u914d\u7f6e\uff0c\u4e00\u4e2a\u7528\u4e8e\u8c03\u8bd5\uff0c\u4e00\u4e2a\u7528\u4e8e\u53d1\u5e03\uff0c\u4e24\u8005\u7684\u533a\u522b\u5728\u4e8e\uff0c\u53d1\u5e03\u7248\u672c\u591a\u4e86\u4e00\u4e2a RELEASE \u5b8f\u5b9a\u4e49\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110160746781",src:n(86448).Z,width:"790",height:"221"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110160810458",src:n(60903).Z,width:"731",height:"219"})),(0,r.kt)("h3",{id:"GCC"},"5.5.3.2\uff1aGCC \u9879\u76ee\u914d\u7f6e"),(0,r.kt)("h4",{id:"gcc_step1"},"5.5.3.2.1\uff1a\u51c6\u5907\u6d4b\u8bd5\u9879\u76ee"),(0,r.kt)("p",null,"\u6309\u7167Demo \u7684\u8981\u6c42\uff0c\u51c6\u5907LED \u6307\u793a\u706f\uff0c\u5f53\u524d\u4f7f\u7528PC13\u4f5c\u4e3a\u6307\u793a\u5668\uff0c\u7528\u4e8e\u9a8c\u8bc1\uff0c\u5f00\u542fSWD \u8c03\u8bd5\u63a5\u53e3\uff0c\u5e76\u914d\u7f6e USART1 \uff0c\u914d\u7f6e\u7cfb\u7edf\u65f6\u949f\u4e3a 64Mhz \uff0c\u51c6\u5907\u5b8c\u6210\u540e\uff0c\u751f\u6210Demo \u4ee3\u7801\uff0c\u5982\u4e0b\u56fe\u6240\u793a\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112625465",src:n(77048).Z,width:"854",height:"660"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112810711",src:n(27059).Z,width:"1112",height:"658"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115133833741",src:n(44911).Z,width:"840",height:"442"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115133904923",src:n(45829).Z,width:"1563",height:"496"})),(0,r.kt)("h4",{id:"gcc_step2"},"5.5.3.2.2\uff1a\u8c03\u6574\u5806\u6808\u5927\u5c0f"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u4f1a\u4f7f\u7528\u52a8\u6001\u5185\u5b58\u5206\u914d\u6765\u5206\u914d\u5185\u90e8\u8d44\u6e90\uff0c\u5728\u8fdb\u884c\u7b7e\u540d\u8fd0\u7b97\u65f6\uff0c\u7531\u4e8e\u8c03\u7528\u5c42\u6570\u8f83\u6df1\uff0c\u53ef\u80fd\u4e5f\u9700\u8981\u9002\u5f53\u7684\u8fdb\u884c\u6808\u5927\u5c0f\u7684\u8c03\u6574\uff0c\u5f53\u524d\u9879\u76ee\u7684\u5806\u6808\u914d\u7f6e\u6587\u4ef6\u4e3a STM32F103RFTX_FLASH.ld\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-assembly"},"_Min_Heap_Size = 0x4000 ; /* required amount of heap */\n_Min_Stack_Size = 0x1000 ; /* required amount of stack */\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5bc6\u5e93\u4f7f\u7528 ECDSA \u7b7e\u540d\u65f6\uff0c\u6700\u4f4e\u9700\u8981 5K \u4ee5\u4e0a\u7684 \u52a8\u6001\u5185\u5b58\uff0c\u5728\u989d\u5916\u52a0\u4e0a\u52a0\u5bc6\u5e93\u672c\u8eab\uff0c\u81f3\u5c11\u9884\u75596K \u4ee5\u4e0a\uff0c\u9700\u8981\u5728\u5b9e\u9645\u4f7f\u7528\u9879\u76ee\u5806\u914d\u7f6e\u7684\u57fa\u7840\u4e0a\uff0c\u518d\u589e\u52a06K \u4ee5\u4e0a\u7684\u5806\u5206\u914d\uff0c\u5982\u679c\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf\uff0c\u5219\u9700\u8981\u914d\u7f6e\u5e93\u7684\u5185\u5b58\u7ba1\u7406\u63a5\u53e3\u56de\u8c03\uff0c\u8be6\u89c1\u540e\u7eed\u7ae0\u8282\u3002")),(0,r.kt)("h4",{id:"gcc_step3"},"5.5.3.2.3\uff1a\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u5c06\u4f7f\u7528\u90e8\u5206\u7684 SRAM \u4f5c\u4e3a\u4ee3\u7801\u6267\u884c\u7f13\u51b2\u533a\uff0c\u6240\u4ee5\uff0c\u9879\u76ee\u5728\u539f\u6765\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u8fdb\u884c\u989d\u5916\u7684\u8c03\u6574\uff0c\u5c06Flash\u5b9e\u9645\u7528\u91cf\u8c03\u5c0f\uff0c\u5c06SRAM \u8fdb\u884c\u8c03\u6574\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u8c03\u6574\u8d44\u6e90\u7684\u76ee\u7684\u662f\u5c06\u90e8\u5206SRAM\uff08\u5f53\u524d\u4e3a 4K\uff09\u4f5c\u4e3a\u52a0\u5bc6\u5e93\u7f13\u51b2\u533a\u4f7f\u7528\uff0c\u540c\u65f6\u5bf9\u5e94\u7684FLASH \u5bb9\u91cf\u9700\u8981\u51cf\u5c0f\u5bf9\u5e94\u7684\u5bb9\u91cf\uff0c\u7528\u4e8e\u5b58\u653e\u52a0\u5bc6\u6570\u636e\uff0c\u8c03\u6574\u540e\u7684\u6574\u4f53\u4ee3\u7801\u7a7a\u95f4\u4e0d\u53d8\uff0c\u5185\u5b58\u51cf\u5c11\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'#\u8c03\u6574\u524d Flash / SRAM \u914d\u7f6e\u4fe1\u606f                                      \n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 96K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 768K\n}\n\n\n#\u8c03\u6574\u540e Flash / SRAM \u914d\u7f6e\u4fe1\u606f                                      \n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 92
1K     /* SRAM from 96K to 92K, 4K for cryptographic code execution */\n  ENCRYPT_CODE (xr)     : ORIGIN = 0x20017000   LENGTH = 4K /* 4K for cryptographic code execution */\n  VECTOR    (rx)    : ORIGIN = 0x08000000   LENGTH = 0x700  /* interrupt vector table */\n  SN    (rx)    : ORIGIN = 0x08000700   LENGTH = 4          /* For storing serial numbers */\n  LIC   (rx)    : ORIGIN = 0x08000704   LENGTH = 0xFC       /* For storing PowerWriter\xae signatures */\n  FLASH    (rx)    : ORIGIN = 0x8000800,   LENGTH = 762K    /* 768K (0xC0000) */\n}   \n\n\n/* Sections */\nSECTIONS\n{\n\n  /* ENCRYPT CODE */\n  .advance_software_protect_encryption_section :\n  {\n    . = ALIGN(4);\n     KEEP(*(.advance_software_protect_encryption_section))\n  } > ENCRYPT_CODE\n  \n  \n  /* SN */\n  .advance_software_protect_sn :\n  {\n    . = ALIGN(4);\n     KEEP(*(.advance_software_protect_sn))\n  } > SN\n  \n  /*\n    ECDSA Signature \n  */\n  .asp_signature_license :\n  {\n    . = ALIGN(4);\n     KEEP(*(.asp_signature_license))\n  } > LIC\n  \n  \n  \n  /* The startup code into "FLASH" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >VECTOR\n  /*****/\n  //....more\n}\n')),(0,r.kt)("h4",{id:"gcc_step4"},"5.5.3.2.4\uff1a\u52a0\u5165lib \u548c source"),(0,r.kt)("p",null,"\u5728\u538b\u7f29\u5305\u4e2dlib \u76ee\u5f55\uff0c\u627e\u5230\u5bf9\u5e94\u7684\u57fa\u7840\u6e90\u7801\uff0c\u76f8\u5173\u5e93\u6587\u4ef6\uff0c\u6dfb\u52a0\u5230\u5de5\u7a0b\u4e2d\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115134854011",src:n(9946).Z,width:"731",height:"322"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"GIF 2025-1-15 13-49-38",src:n(36548).Z,width:"957",height:"631"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"GIF 2025-1-15 13-51-20",src:n(34730).Z,width:"1589",height:"940"})),(0,r.kt)("p",null,"\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u5de5\u7a0b\u7ed3\u6784\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115135211142",src:n(42399).Z,width:"735",height:"476"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u8bf7\u6839\u636e\u82af\u7247\u7684\u5185\u6838\u7248\u672c\uff0c\u6dfb\u52a0\u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\uff0c\u5f53\u524d\u5b9e\u4f8b\u5de5\u7a0b\u4e3a STM32F103RFT6\uff0c\u5185\u6838\u4e3a ARM Cortex M3 \u5185\u6838\u3002")),(0,r.kt)("h4",{id:"gcc_step5"},"5.5.3.2.5\uff1a\u52a0\u5165\u547d\u4ee4\u884c"),(0,r.kt)("p",null," \u7f16\u8bd1\u7684\u56fa\u4ef6\u4e3a\u539f\u59cb\u7684\u56fa\u4ef6\uff0c\u5982\u4e0d\u7ecf\u8fc7\u547d\u4ee4\u884c\u8fdb\u884c\u5904\u7406\uff0c\u4f1a\u5bfc\u81f4\u76f8\u5173\u529f\u80fd\u6ca1\u6709\u5f00\u542f\uff0c\u5e76\u4e14\u5728\u5b9e\u9645\u4ea7\u54c1\u4e2d\uff0c\u53ef\u80fd\u65e0\u6cd5\u8fd0\u884c\uff0c\u56e0\u4e3a\uff0c\u6211\u4eec\u9700\u8981\u5c06\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u6dfb\u52a0\u5230\u5de5\u7a0b\u914d\u7f6e\u4e2d\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115135430886",src:n(26643).Z,width:"884",height:"713"})),(0,r.kt)("ul",{className:"contains-task-list"},(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("input",{parentName:"p",type:"checkbox",checked:!0,disabled:!0})," ","\u5728post-build steps\uff0c\u6211\u4eec\u5c06\u7b2c\u4e00\u6b65\u8f93\u51fa\u7684 hex \u6587\u4ef6\uff0c\u751f\u6210\u6700\u7ec8\u7528\u4e8e\u751f\u4ea7\u7684\u56fa\u4ef6\uff0c\u4f7f\u7528\u7684\u547d\u4ee4\u4e3a\uff1a"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"../advance_software_protect.exe -i ./stm32f103rfc6.hex -r 0x20017000\n-s 0x08000000           #-s \u8868\u793aFlash \u56fa\u4ef6\u7684\u8d77\u59cb\u5730\u5740\u4e3a 0x08000000\n-k 0xfb90ffcb9b62c2e6   #-k \u8868\u793a\u52a0\u5bc6\u7684\u5bc6\u7801\uff0c\u957f\u5ea6\u4e3a8 \u5b57\u8282\uff0c\u5fc5\u987b\u548c\u6e90\u7801\u8fdb\u884c\u5bf9\u5e94\uff0c\u6bcf\u4e00\u4e2a\u9879\u76ee\u5fc5\u987b\u66f4\u6539\uff0c\u907f\u514d\u548c\u522b\u4eba\u7684\u9879\u76ee\u91c7\u7528\u4e00\u6837\u7684\u5bc6\u7801\n-i ./stm32f103rfc6.hex #-i \u5bfc\u5165\u4e3bFlash \u56fa\u4ef6 \n-r 0x20017000 #-r \u53ef\u4ee5\u6307\u5b9a\u4ece hex \u6587\u4ef6\u4e2d\u62bd\u53d6 ENCRYPT_CODE \u4f5c\u4e3a\u52a0\u5bc6\u4ee3\u7801\u533a\u95f4 \n")))),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u6bcf\u4e00\u4e2a\u9879\u76ee\u7684 -k\uff0c\u4e5f\u5c31\u662f\u52a0\u5bc6\u5bc6\u7801\uff0c\u5fc5\u987b\u968f\u673a\u751f\u6210 8\u5b57\u8282\uff0c\u907f\u514d\u91c7\u7528\u516c\u7528\u7684\u5bc6\u7801\uff0c\u4ee5\u63d0\u9ad8\u5b89\u5168\u6027\u3002"),(0,r.kt)("p",{parentName:"admonition"},"\u66f4\u591a\u5173\u4e8e\u547d\u4ee4\u884c\u7684\u7528\u6cd5\uff0c\u8bf7\u53c2\u8003 ",(0,r.kt)("a",{parentName:"p",href:"#cli"},"\u547d\u4ee4\u884c")," \u7ae0\u8282\u3002")),(0,r.kt)("h4",{id:"gcc_step6"},"5.5.3.2.6\uff1a\u5176\u4ed6\u8bbe\u7f6e"),(0,r.kt)("p",null,"\u4e3a\u4e86\u8ba9\u7f16\u8bd1\u7684\u8f93\u51fa\u7684\u56fa\u4ef6\u53ef\u4ee5\u88ab\u547d\u4ee4\u884c\u5904\u7406\uff0c\u6211\u4eec\u9700\u8981\u8f93\u51fahex \u6587\u4ef6\u683c\u5f0f\uff0c\u8bbe\u7f6e\u5982\u4e0b"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115135707841",src:n(26601).Z,width:"782",height:"407"})),(0,r.kt)("p",null,"\u5f53\u524d\u8c03\u8bd5\u5668\u91c7\u7528PowerWriter\xae \u81ea\u5e26\u7684\u8c03\u8bd5\u5668\uff0c\u4f7f\u7528\u65b9\u6cd5\uff0c\u8bf7\u53c2\u8003\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://docs.PowerWriter.com/docs/next/faq/PowerWriter/base/Debugger"},"3.1.7\uff1a\u8c03\u8bd5\u5668\u4f7f\u7528\u6559\u7a0b | PowerWriter\xae\u6587\u6863\u4e2d\u5fc3"),"\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u8fdb\u884c\u5f00\u53d1\u5f53\u4e2d\uff0c\u7531\u4e8e\u4e0d\u9700\u8981IDE \u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0c\u6240\u4ee5\uff0c\u9700\u8981\u5c06\u8c03\u8bd5\u5668\u7684\u7f16\u7a0b\uff0c\u6821\u9a8c\u529f\u80fd\u8fdb\u884c\u5173\u95ed\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115135922084",src:n(54763).Z,width:"1110",height:"695"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u4f9d\u7136\u53ef\u4ee5\u8fdb\u884c\u9879\u76ee\u7684\u8c03\u8bd5\uff0c\u4f46\u662f\u4e0b\u8f7d\u91c7\u7528PowerWriter\xae \u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0cIDE\u4e0d\u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0c\u4ee5\u4fbf\u9a8c\u8bc1\u6700\u7ec8\u7684\u6548\u679c\u3002")),(0,r.kt)("p",null,"\u5f53\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u53ef\u80fd\u4f1a\u5b58\u5728\u4ee3\u7801\u8fd0\u884c\u4e4b\u540e\uff0c\u5173\u95ed\u8c03\u8bd5\u5668\uff0c\u5e76\u5f00\u542f\u8bfb\u4fdd\u62a4\uff0c\u5c06\u5bfc\u81f4\u8c03\u8bd5\u529f\u80fd\u65ad\u7ebf\uff0c\u56e0\u4e3a\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u505a\u4e24\u4e2a\u5de5\u7a0b\u914d\u7f6e\uff0c\u4e00\u4e2a\u7528\u4e8e\u8c03\u8bd5\uff0c\u4e00\u4e2a\u7528\u4e8e\u53d1\u5e03\uff0c\u4e24\u8005\u7684\u533a\u522b\u5728\u4e8e\uff0c\u53d1\u5e03\u7248\u672c\u591a\u4e86\u4e00\u4e2a RELEASE \u5b8f\u5b9a\u4e49\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115140050505",src:n(64203).Z,width:"834",height:"556"})),(0,r.kt)("p",null,"\u6b64\u5916\uff0c\u7531\u4e8e\u6211\u4eec\u5728\u8d44\u6e90\u5206\u914d\u65f6\u5b9a\u4e49\u4e86\u65b0\u7684\u8282\u70b9\uff0c\u7f16\u8bd1\u53ef\u80fd\u4f1a\u4ea7\u751f\u8b66\u544a\uff0c\u6211\u4eec\u5728GCC Linker \u4e2d\u53bb\u9664\u7279\u5b9a\u7684\u8b66\u544a\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115140224757",src:n(49468).Z,width:"872",he
1ight:"647"})),(0,r.kt)("p",null,"\u5b8c\u6210\u6240\u6709\u7684\u8bbe\u7f6e\u4e4b\u540e\uff0c\u6211\u4eec\u7f16\u8bd1\u5de5\u7a0b\uff0c\u5c06\u770b\u5230\u5982\u4e0b\u8f93\u51fa\u4fe1\u606f\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250115140312306",src:n(13747).Z,width:"1765",height:"784"})),(0,r.kt)("h3",{id:"IAR"},"5.5.3.3\uff1aIAR \u9879\u76ee\u914d\u7f6e"),(0,r.kt)("h4",{id:"iar_step1"},"5.5.3.3.1\uff1a\u51c6\u5907\u6d4b\u8bd5\u9879\u76ee"),(0,r.kt)("p",null,"\u6309\u7167Demo \u7684\u8981\u6c42\uff0c\u51c6\u5907LED \u6307\u793a\u706f\uff0c\u5f53\u524d\u4f7f\u7528PC13\u4f5c\u4e3a\u6307\u793a\u5668\uff0c\u7528\u4e8e\u9a8c\u8bc1\uff0c\u5f00\u542fSWD \u8c03\u8bd5\u63a5\u53e3\uff0c\u5e76\u914d\u7f6e USART1 \uff0c\u914d\u7f6e\u7cfb\u7edf\u65f6\u949f\u4e3a 64Mhz \uff0c\u51c6\u5907\u5b8c\u6210\u540e\uff0c\u751f\u6210Demo \u4ee3\u7801\uff0c\u5982\u4e0b\u56fe\u6240\u793a\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112625465",src:n(77048).Z,width:"854",height:"660"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110112810711",src:n(27059).Z,width:"1112",height:"658"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116111707295",src:n(51183).Z,width:"798",height:"252"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116111736247",src:n(29702).Z,width:"1393",height:"853"})),(0,r.kt)("h4",{id:"iar_step2"},"5.5.3.3.2\uff1a\u8c03\u6574\u5806\u6808\u5927\u5c0f"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u4f1a\u4f7f\u7528\u52a8\u6001\u5185\u5b58\u5206\u914d\u6765\u5206\u914d\u5185\u90e8\u8d44\u6e90\uff0c\u5728\u8fdb\u884c\u7b7e\u540d\u8fd0\u7b97\u65f6\uff0c\u7531\u4e8e\u8c03\u7528\u5c42\u6570\u8f83\u6df1\uff0c\u53ef\u80fd\u4e5f\u9700\u8981\u9002\u5f53\u7684\u8fdb\u884c\u6808\u5927\u5c0f\u7684\u8c03\u6574\uff0c\u540c\u65f6\u8c03\u6574 Flash \u548c SRAM \u5747\u51cf\u5c0f4K\uff0c\u7528\u6765\u5b58\u50a8\u52a0\u5bc6\u4ee3\u7801\uff0c\u987a\u4fbf\u5c06\u5806\u6808\u5927\u5c0f\u8fdb\u884c\u8c03\u6574\uff0c\u4ee5\u9632\u6b62\u52a0\u5bc6\u5e93\u8fd0\u884c\u65f6\uff0c\u5806\u6808\u6ea2\u51fa\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"GIF 2025-1-16 11-21-09",src:n(7312).Z,width:"592",height:"616"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5bc6\u5e93\u4f7f\u7528 ECDSA \u7b7e\u540d\u65f6\uff0c\u6700\u4f4e\u9700\u8981 5K \u4ee5\u4e0a\u7684 \u52a8\u6001\u5185\u5b58\uff0c\u5728\u989d\u5916\u52a0\u4e0a\u52a0\u5bc6\u5e93\u672c\u8eab\uff0c\u81f3\u5c11\u9884\u75596K \u4ee5\u4e0a\uff0c\u9700\u8981\u5728\u5b9e\u9645\u4f7f\u7528\u9879\u76ee\u5806\u914d\u7f6e\u7684\u57fa\u7840\u4e0a\uff0c\u518d\u589e\u52a06K \u4ee5\u4e0a\u7684\u5806\u5206\u914d\uff0c\u5982\u679c\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf\uff0c\u5219\u9700\u8981\u914d\u7f6e\u5e93\u7684\u5185\u5b58\u7ba1\u7406\u63a5\u53e3\u56de\u8c03\uff0c\u8be6\u89c1\u540e\u7eed\u7ae0\u8282\u3002")),(0,r.kt)("h4",{id:"iar_step3"},"5.5.3.3.3\uff1a\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u5c06\u4f7f\u7528\u90e8\u5206\u7684 SRAM \u4f5c\u4e3a\u4ee3\u7801\u6267\u884c\u7f13\u51b2\u533a\uff0c\u6240\u4ee5\uff0c\u9879\u76ee\u5728\u539f\u6765\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u8fdb\u884c\u989d\u5916\u7684\u8c03\u6574\uff0c\u5c06Flash\u5b9e\u9645\u7528\u91cf\u8c03\u5c0f\uff0c\u5c06SRAM \u8fdb\u884c\u8c03\u6574\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116112647643",src:n(26053).Z,width:"706",height:"543"})),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u8c03\u6574\u8d44\u6e90\u7684\u76ee\u7684\u662f\u5c06\u90e8\u5206SRAM\uff08\u5f53\u524d\u4e3a 4K\uff09\u4f5c\u4e3a\u52a0\u5bc6\u5e93\u7f13\u51b2\u533a\u4f7f\u7528\uff0c\u540c\u65f6\u5bf9\u5e94\u7684FLASH \u5bb9\u91cf\u9700\u8981\u51cf\u5c0f\u5bf9\u5e94\u7684\u5bb9\u91cf\uff0c\u7528\u4e8e\u5b58\u653e\u52a0\u5bc6\u6570\u636e\uff0c\u8c03\u6574\u540e\u7684\u6574\u4f53\u4ee3\u7801\u7a7a\u95f4\u4e0d\u53d8\uff0c\u5185\u5b58\u51cf\u5c11\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'/*###ICF### Section handled by ICF editor, don\'t touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile="$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__ = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__   = 0x080BF000;\ndefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__   = 0x20017000;\n\n/* \u65b0\u589e ENCRYPT_CODE \u533a\u6bb5\u5b9a\u4e49 */\ndefine symbol __ICFEDIT_region_RAMCODE_start__ = 0x20017000;\ndefine symbol __ICFEDIT_region_RAMCODE_end__   = 0x20018000;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x1000;\ndefine symbol __ICFEDIT_size_heap__   = 0x4000;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;
1\ndefine region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\n/* \u65b0\u589e ENCRYPT_CODE \u533a\u6bb5 */\ndefine region RAMCODE_region   = mem:[from __ICFEDIT_region_RAMCODE_start__   to __ICFEDIT_region_RAMCODE_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,block CSTACK, block HEAP };\n/* \u8bbe\u7f6e\u52a0\u5bc6\u4ee3\u7801\u8282\u70b9\u4e3a advance_software_protect_encryption_section \uff01\uff01\uff01\uff01\uff01*/\nplace in ENCRYPT_CODE_region { readonly section .advance_software_protect_encryption_section};\n')),(0,r.kt)("h4",{id:"iar_step4"},"5.5.3.3.4\uff1a\u52a0\u5165lib \u548c source"),(0,r.kt)("p",null,"\u5728\u538b\u7f29\u5305\u4e2dlib \u76ee\u5f55\uff0c\u627e\u5230\u5bf9\u5e94\u7684\u57fa\u7840\u6e90\u7801\uff0c\u76f8\u5173\u5e93\u6587\u4ef6\uff0c\u6dfb\u52a0\u5230\u5de5\u7a0b\u4e2d\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116112903692",src:n(54546).Z,width:"667",height:"334"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116112935699",src:n(59187).Z,width:"439",height:"220"})),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116113002281",src:n(25617).Z,width:"630",height:"631"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u8bf7\u6839\u636e\u82af\u7247\u7684\u5185\u6838\u7248\u672c\uff0c\u6dfb\u52a0\u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\uff0c\u5f53\u524d\u5b9e\u4f8b\u5de5\u7a0b\u4e3a STM32F103RFT6\uff0c\u5185\u6838\u4e3a ARM Cortex M3 \u5185\u6838\u3002")),(0,r.kt)("h4",{id:"iar_step5"},"5.5.3.3.5\uff1a\u52a0\u5165\u547d\u4ee4\u884c"),(0,r.kt)("p",null," \u7f16\u8bd1\u7684\u56fa\u4ef6\u4e3a\u539f\u59cb\u7684\u56fa\u4ef6\uff0c\u5982\u4e0d\u7ecf\u8fc7\u547d\u4ee4\u884c\u8fdb\u884c\u5904\u7406\uff0c\u4f1a\u5bfc\u81f4\u76f8\u5173\u529f\u80fd\u6ca1\u6709\u5f00\u542f\uff0c\u5e76\u4e14\u5728\u5b9e\u9645\u4ea7\u54c1\u4e2d\uff0c\u53ef\u80fd\u65e0\u6cd5\u8fd0\u884c\uff0c\u56e0\u4e3a\uff0c\u6211\u4eec\u9700\u8981\u5c06\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u6dfb\u52a0\u5230\u5de5\u7a0b\u914d\u7f6e\u4e2d\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116113103073",src:n(16868).Z,width:"1209",height:"571"})),(0,r.kt)("ul",{className:"contains-task-list"},(0,r.kt)("li",{parentName:"ul",className:"task-list-item"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("input",{parentName:"p",type:"checkbox",checked:!0,disabled:!0})," ","\u5728post-build steps\uff0c\u6211\u4eec\u5c06\u7b2c\u4e00\u6b65\u8f93\u51fa\u7684 hex \u6587\u4ef6\uff0c\u751f\u6210\u6700\u7ec8\u7528\u4e8e\u751f\u4ea7\u7684\u56fa\u4ef6\uff0c\u4f7f\u7528\u7684\u547d\u4ee4\u4e3a\uff1a"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'"./../../../../tool/windows/advance_software_protect.exe" -k 0xfb90ffcb9b62c2e6 -i ./stm32f103rfc6-Release/Exe/stm32f103rfc6.hex -r 0x20017004 && echo > "$BUILD_FILES_DIR$/.postbuild"\n-s  #-s \u8868\u793aFlash \u56fa\u4ef6\u7684\u8d77\u59cb\u5730\u5740\u4e3a 0x08000000\n-k  #-k \u8868\u793a\u52a0\u5bc6\u7684\u5bc6\u7801\uff0c\u957f\u5ea6\u4e3a8 \u5b57\u8282\uff0c\u5fc5\u987b\u548c\u6e90\u7801\u8fdb\u884c\u5bf9\u5e94\uff0c\u6bcf\u4e00\u4e2a\u9879\u76ee\u5fc5\u987b\u66f4\u6539\uff0c\u907f\u514d\u548c\u522b\u4eba\u7684\u9879\u76ee\u91c7\u7528\u4e00\u6837\u7684\u5bc6\u7801\n-i  #-i \u5bfc\u5165\u4e3bFlash \u56fa\u4ef6 \n-r  #-r \u53ef\u4ee5\u6307\u5b9a\u4ece hex \u6587\u4ef6\u4e2d\u62bd\u53d6 ENCRYPT_CODE \u4f5c\u4e3a\u52a0\u5bc6\u4ee3\u7801\u533a\u95f4 \n')))),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u6bcf\u4e00\u4e2a\u9879\u76ee\u7684 -k\uff0c\u4e5f\u5c31\u662f\u52a0\u5bc6\u5bc6\u7801\uff0c\u5fc5\u987b\u968f\u673a\u751f\u6210 8\u5b57\u8282\uff0c\u907f\u514d\u91c7\u7528\u516c\u7528\u7684\u5bc6\u7801\uff0c\u4ee5\u63d0\u9ad8\u5b89\u5168\u6027\u3002"),(0,r.kt)("p",{parentName:"admonition"},"\u66f4\u591a\u5173\u4e8e\u547d\u4ee4\u884c\u7684\u7528\u6cd5\uff0c\u8bf7\u53c2\u8003 ",(0,r.kt)("a",{parentName:"p",href:"#cli"},"\u547d\u4ee4\u884c")," \u7ae0\u8282\u3002")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"-r \u53c2\u6570\u5728 IAR \u7f16\u8bd1\u4e2d\uff0c\u867d\u7136\u6211\u4eec\u8bbe\u7f6e\u52a0\u5bc6\u4ee3\u7801\u8282\u70b9\u4e3a \u67d0\u4e2a\u6307\u5b9a\u7684\u5730\u5740\uff0c\u6bd4\u59820x20001700\uff0c\u4f46\u662f\u7f16\u8bd1\u5668\u8f93\u51fa\u7684\u5b9e\u9645\u5730\u5740\u53ef\u80fd\u5e76\u4e0d\u662f 0x20001700\uff0c\u6bd4\u5982\u53d8\u6210\u4e860x20001704\uff0c\u53ef\u4ee5\u901a\u8fc7PowerWriter\xae \u52a0\u8f7d\u56fa\u4ef6\uff0c\u67e5\u7
170b\u5206\u6bb5\u5730\u5740\uff0c\u662f\u591a\u5c11\uff0c\u540c\u65f6\u4ee3\u7801\u4e2d\u7684 \u52a0\u8f7d\u5730\u5740\uff0c\u4ee5\u53ca\u547d\u4ee4\u884c\u53c2\u6570\uff0c\u4e5f\u5e94\u8be5\u540c\u6b65\u8fdb\u884c\u4fee\u6539\uff0c\u6309\u7167\u7f16\u8bd1\u5668\u6700\u7ec8\u7684\u8f93\u51fa\u6587\u4ef6\u4e3a\u51c6\u3002")),(0,r.kt)("h4",{id:"iar_step6"},"5.5.3.3.6\uff1a\u5176\u4ed6\u8bbe\u7f6e"),(0,r.kt)("p",null,"\u4e3a\u4e86\u8ba9\u7f16\u8bd1\u7684\u8f93\u51fa\u7684\u56fa\u4ef6\u53ef\u4ee5\u88ab\u547d\u4ee4\u884c\u5904\u7406\uff0c\u6211\u4eec\u9700\u8981\u8f93\u51fahex \u6587\u4ef6\u683c\u5f0f\uff0c\u8bbe\u7f6e\u5982\u4e0b"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116113618874",src:n(11856).Z,width:"660",height:"654"})),(0,r.kt)("p",null,"\u5f53\u524d\u8c03\u8bd5\u5668\u91c7\u7528PowerWriter\xae \u81ea\u5e26\u7684\u8c03\u8bd5\u5668\uff0c\u4f7f\u7528\u65b9\u6cd5\uff0c\u8bf7\u53c2\u8003\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://docs.PowerWriter.com/docs/next/faq/PowerWriter/base/Debugger"},"3.1.7\uff1a\u8c03\u8bd5\u5668\u4f7f\u7528\u6559\u7a0b | PowerWriter\xae\u6587\u6863\u4e2d\u5fc3"),"\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u8fdb\u884c\u5f00\u53d1\u5f53\u4e2d\uff0c\u7531\u4e8e\u4e0d\u9700\u8981IDE \u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0c\u5728\u8c03\u8bd5\u65f6\uff0c\u4f7f\u7528Debug without download \u6a21\u5f0f\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250116113723060",src:n(75888).Z,width:"255",height:"108"})),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u4f9d\u7136\u53ef\u4ee5\u8fdb\u884c\u9879\u76ee\u7684\u8c03\u8bd5\uff0c\u4f46\u662f\u4e0b\u8f7d\u91c7\u7528PowerWriter\xae \u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0cIDE\u4e0d\u8fdb\u884c\u4e0b\u8f7d\u548c\u6821\u9a8c\uff0c\u4ee5\u4fbf\u9a8c\u8bc1\u6700\u7ec8\u7684\u6548\u679c\u3002")),(0,r.kt)("p",null,"\u5f53\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u53ef\u80fd\u4f1a\u5b58\u5728\u4ee3\u7801\u8fd0\u884c\u4e4b\u540e\uff0c\u5173\u95ed\u8c03\u8bd5\u5668\uff0c\u5e76\u5f00\u542f\u8bfb\u4fdd\u62a4\uff0c\u5c06\u5bfc\u81f4\u8c03\u8bd5\u529f\u80fd\u65ad\u7ebf\uff0c\u56e0\u4e3a\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u505a\u4e24\u4e2a\u5de5\u7a0b\u914d\u7f6e\uff0c\u4e00\u4e2a\u7528\u4e8e\u8c03\u8bd5\uff0c\u4e00\u4e2a\u7528\u4e8e\u53d1\u5e03\uff0c\u4e24\u8005\u7684\u533a\u522b\u5728\u4e8e\uff0c\u53d1\u5e03\u7248\u672c\u591a\u4e86\u4e00\u4e2a RELEASE \u5b8f\u5b9a\u4e49\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"GIF 2025-1-16 11-40-23",src:n(62567).Z,width:"1108",height:"723"})),(0,r.kt)("p",null,"\u5b8c\u6210\u6240\u6709\u7684\u8bbe\u7f6e\u4e4b\u540e\uff0c\u6211\u4eec\u7f16\u8bd1\u5de5\u7a0b\uff0c\u5c06\u770b\u5230\u5982\u4e0b\u8f93\u51fa\u4fe1\u606f\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"GIF 2025-1-16 11-42-38",src:n(75852).Z,width:"1738",height:"951"})),(0,r.kt)("h2",{id:"usage"},"5.5.4\uff1a\u914d\u7f6e\u4ee5\u53ca\u4f7f\u7528\u6559\u7a0b"),(0,r.kt)("p",null,"\u901a\u8fc7 5.5.3 \u8282\u7684\u5185\u5bb9\uff0c\u73b0\u5728\u6211\u4eec\u5b8c\u6210\u4e86\u4e3b\u6d41 IDE \u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\uff0c\u672c\u7ae0\u8282\uff0c\u5c06\u8be6\u7ec6\u4ecb\u7ecd\uff0c\u52a0\u5bc6\u5e93\u7684\u76f8\u5173\u529f\u80fd\uff0c\u4ee5\u53ca\u4f7f\u7528\u65b9\u6cd5\u3002"),(0,r.kt)("h3",{id:"config"},"5.5.4.1\uff1a\u7cfb\u7edf\u914d\u7f6e"),(0,r.kt)("p",null,"\u5728\u52a0\u5bc6\u5e93\u8fdb\u884c\u6267\u884c\u524d\uff0c\u6211\u4eec\u9700\u8981\u5b8c\u6210\u52a0\u5bc6\u5e93\u7684\u521d\u59cb\u5316\uff0c\u4ee5\u53ca\u52a0\u5165 sample code\uff0c\u5982\u4e0b\u56fe\u6240\u793a:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"\n/*\n * IMPORTANT:\n * Do not encrypt the parent function () that contains the\n * advance_software_protect_encryption_code_loader!\n */\nvoid advance_software_protect_init()\n{\n    /* initial */\n    advance_software_protect_set_mem_calloc_free_callback(calloc_mem_func, free_mem_func);
1\n    advance_software_protect_set_logger_callback(advance_software_protect_log_output);\n    /* show informations */\n    advance_software_protect_rights();\n#ifdef ADVANCE_SOFTWARE_PROTECT_CODE_ENCRYPT_ENABLE\n    /* encrypt code loader  */\n    advance_software_protect_encryption_code_loader(ADV_ENCRYPT_CODE_SEGMENT_ADDR, ADV_DATA_ENCRYPT_KEY, advance_software_protect_encrypt_code_sample);\n#endif\n}\n\nint main(void)\n{   \n  /* \u521d\u59cb\u5316\u52a0\u5bc6\u5e93 */\n  advance_software_protect_init();          \n    \n  while (1){\n  }\n  /* USER CODE END 3 */\n}\n")),(0,r.kt)("h4",{id:"config_mem"},"5.5.4.1.1\uff1a\u5185\u5b58\u63a5\u53e3\u914d\u7f6e"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u5185\u90e8\u90e8\u5206\u529f\u80fd\u6a21\u5757\uff0c\u9700\u8981\u52a8\u6001\u7533\u8bf7\u5185\u5b58\uff0c\u5e93\u5185\u90e8\u9ed8\u8ba4\u914d\u7f6e\u7684 \u5185\u5b58\u63a5\u53e3\u4e3a\uff0ccalloc \u548c free\uff0c\u4f46\u662f\u5728\u4f7f\u7528RTOS \u7684\u9879\u76ee\u4e2d\u4f7f\u7528\u65f6\uff0c\u53ef\u80fd\u4f1a\u5b58\u5728\u5185\u5b58\u7ba1\u7406\u95ee\u9898\uff0c\u6b64\u5916\u4e5f\u4e0d\u5229\u4e8e\u8c03\u8bd5\u5206\u6790\uff0c\u6570\u636e\u7684\u89c2\u5bdf\uff0c\u56e0\u6b64\uff0c\u63d0\u4f9b\u4e86\u5185\u5b58\u7ba1\u7406\u5206\u914d\u63a5\u53e3\uff0c\u51fd\u6570\u539f\u578b\u4e3a\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"bool advance_software_protect_set_mem_calloc_free_callback(calloc_func_cb calloc_func, free_func_cb free_func);\n")),(0,r.kt)("p",null,"\u914d\u7f6e\u53c2\u8003\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"/* memory alloc & free */\nvoid *calloc_mem_func(size_t count, size_t size)\n{\n    return calloc(count, size);\n}\nvoid free_mem_func(void *blk_obj)\n{\n    free(blk_obj);\n}\n\n\nvoid advance_software_protect_init()\n{\n    /* initial */\n    advance_software_protect_set_mem_calloc_free_callback(calloc_mem_func, free_mem_func);\n}\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5982\u679c\u4e0d\u4f7f\u7528RTOS\uff0c\u6b64\u63a5\u53e3\u4e3a\u975e\u5fc5\u987b\uff0c\u5f53\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf\u65f6\uff0c\u8bf7\u6ce8\u610f\u9700\u8981 \u5bf9\u7533\u8bf7\u7684\u5185\u5b58\u6267\u884c memset \u4e3a 0 \uff0c\u8be6\u89c1 ",(0,r.kt)("a",{parentName:"p",href:"#rtos_stack"},"\u64cd\u4f5c\u7cfb\u7edf\u4efb\u52a1\u5806\u5206\u914d"),"\u3002\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u6ce8\u518c\u5185\u5b58\u63a5\u53e3\uff0c\u5185\u5b58\u5206\u914d\u548c\u5185\u5b58\u91ca\u653e\u5fc5\u987b\u6210\u5bf9\u51fa\u73b0\u3002")),(0,r.kt)("h4",{id:"config_log"},"5.5.4.1.2\uff1a\u65e5\u5fd7\u63a5\u53e3\u914d\u7f6e"),(0,r.kt)("p",null,"\u4e3a\u4e86\u4fbf\u4e8e\u5f00\u53d1\u4eba\u5458\u5206\u6790\u548c\u89c2\u5bdf\u6570\u636e\uff0c\u52a0\u5bc6\u5e93\u63d0\u4f9b\u4e86\u6807\u51c6\u7684\u65e5\u5fd7\u529f\u80fd\u6a21\u5757\uff0c\u5728\u52a0\u5bc6\u5e93\u8fd0\u884c\u65f6\uff0c\u5185\u90e8\u4e5f\u4f1a\u8f93\u51fa\u4e00\u90e8\u5206\u65e5\u5fd7\u4fe1\u606f\uff0c\u4ee5\u4fbf\u4e8e\u9879\u76ee\u7684\u8c03\u8bd5\uff0c\u51fd\u6570\u539f\u578b\u4e3a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"bool advance_software_protect_set_logger_callback(const advance_software_logger_callback cb);\n")),(0,r.kt)("p",null,"\u914d\u7f6e\u53c2\u8003\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"/* message callback */\n#ifdef STM32F103xG\nextern UART_HandleTypeDef huart1;\n#endif\nstatic void advance_software_protect_log_output(const char *msg)\n{\n#ifdef STM32F103xG\n    HAL_UART_Transmit(&huart1, (uint8_t *)msg, strlen(msg), strlen(msg));\n#endif\n}\n\nvoid advance_software_protect_init()\n{\n    /* initial */\n    advance_software_protect_set_logger_callback(advance_software_protect_log_output);\n    //advance_software_protect_set_logger_callback(0); //\u5982\u679c\u53c2\u6570\u4e3a0\uff0c\u5185\u90e8\u5c06\u81ea\u52a8\u91ca\u653e\u8d44\u6e90\uff0c\u5e76\u5173\u95ed\u529f\u80fd\n}\n")),(0,r.kt)("p",null,"\u8f93\u51fa\u65e5\u5fd7\u7684\u6807\u51c6\u8c03\u7528\u65b9\u5f0f\uff0c\u540c printf \u51fd\u6570\u7c7b\u4f3c\uff0c\u533a\u522b\u5728\u4e8e\uff0c\u5f53\u524d\u7684\u65e5\u5fd7\u6a21\u5757\uff0c\u4e00\u4e2a\u53c2\u6570\u4e3a\u65e5\u5fd7\u7c7b\u578b\uff0c\u89c1 E_ADV_SOFWARE_PROTECT_LOG_TYPE \u5b9a\u4e49\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"/* Log type*/\ntypedef enum E_ADV_SOFWARE_PROTECT_LOG_TYPE\n{\n    ADV_BLANK,\n    ADV_INFO,\n    ADV_DEBUG,\n    ADV_WARN,\n    ADV_EXCEPTION,\n    ADV_ERROR,\n    ADV_MAX\n} E_ADV_SOFWARE_PROTECT_LOG_TYPE;
1\n\nadvance_software_protect_logger(type, format, ...)\n    \n//\u4f7f\u7528\u65b9\u6cd5\u8bf7\u53c2\u8003 advance_software_protect_samples.c \u4e2d\u8303\u4f8b\n")),(0,r.kt)("h4",{id:"config_encrtypt_code"},"5.5.4.1.3\uff1a\u52a0\u5bc6\u51fd\u6570loader"),(0,r.kt)("p",null,"\u5728\u8fdb\u884c\u52a0\u5bc6\u5e93\u7684\u4efb\u4f55\u529f\u80fd\u8c03\u7528\uff0c\u6216\u8005\u662f\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u52a0\u5bc6\u51fd\u6570\u8c03\u7528\u4e4b\u524d\uff0c\u5fc5\u987b\u8fdb\u884c\u52a0\u5bc6\u51fd\u6570\u7684\u521d\u59cb\u5316\uff0c\u5426\u5219\u5c06\u4ea7\u751f\u5f02\u5e38\uff0c\u51fd\u6570\u539f\u578b\u58f0\u660e\u5982\u4e0b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"void advance_software_protect_encryption_code_loader(uint32_t load_address, uint64_t key, CodeLoaderCallback callback);\n")),(0,r.kt)("p",null,"load_address\uff1a\u8868\u793a\u52a0\u8f7d\u5730\u5740\uff0c\u5fc5\u987b\u548c .advance_software_protect_encryption_section \u8282\u70b9\u5730\u5740\u5b8c\u5168\u4e00\u81f4\uff0c\u5426\u5219\u5c06\u4ea7\u751f\u5f02\u5e38\uff0c\u8be6\u89c1 ",(0,r.kt)("a",{parentName:"p",href:"#mdk_step3"},"\u8c03\u6574\u5de5\u7a0b\u8d44\u6e90\u5206\u914d"),"\u3002"),(0,r.kt)("p",null,"key\uff1a\u6570\u636e\u52a0\u5bc6\u7684\u5bc6\u7801\uff0c\u5fc5\u987b\u548c \u547d\u4ee4\u884c \u4f20\u53c2\u4e00\u81f4\uff0c\u5426\u5219\u5c06\u4f1a\u5bfc\u81f4\u52a0\u8f7d\u5931\u8d25\uff0c\u8be6\u89c1  ",(0,r.kt)("a",{parentName:"p",href:"#mdk_step5"},"\u52a0\u5165\u547d\u4ee4\u884c"),"\u3002"),(0,r.kt)("p",null,"callback\uff1a\u52a0\u8f7d\u56de\u8c03\u51fd\u6570\uff0c\u7528\u4e8e\u68c0\u6d4b\u52a0\u8f7d\u4fe1\u606f\u3002"),(0,r.kt)("p",null,"\u52a0\u5bc6\u51fd\u6570\u7684\u5178\u578b\u521d\u59cb\u5316\u65b9\u5f0f\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'/* message callback */\n/*  segment address */\n#ifdef ADVANCE_SOFTWARE_PROTECT_CODE_ENCRYPT_ENABLE\n#define ADV_ENCRYPT_CODE_SEGMENT_ADDR (0x20017000) /* refer to advance_software_protect_encryption_section */\n#endif\n\n\n/* key for data encrypt */\n#if (defined ADVANCE_SOFTWARE_PROTECT_FLASH_VERIFY_ENABLE) || (defined ADVANCE_SOFTWARE_PROTECT_CODE_ENCRYPT_ENABLE)\n#define ADV_DATA_ENCRYPT_KEY (0xfb90ffcb9b62c2e6) /* 64 bit*/\n#endif\n\n\n/* for ram code loader */\nvoid advance_software_protect_encrypt_code_sample(E_ENCRYPT_CODE_EVENT event)\n{\n    switch (event)\n    {\n\n    /* Development mode running */\n    case EncryptCodeUnprocessed:\n        advance_software_protect_logger(ADV_EXCEPTION, " (\u672a\u5904\u7406 !) \u8bf7\u4f7f\u7528\u547d\u4ee4\u884c\u5c06\u56fa\u4ef6\u8fdb\u884c\u5904\u7406\u540e\uff0c\u5e76\u4f7f\u7528PowerWriter\xae \u7f16\u7a0b\u540e\u518d\u8bd5 ...\\r\\n");\n        while (1)\n        {\n        } /* suspended */\n\n    /* Loading RAM code succeeded   */\n    case EncryptCodeOk:\n        advance_software_protect_logger(ADV_DEBUG, " (\u6210\u529f) \u52a0\u8f7d\u6210\u529f ...\\r\\n");\n        break;\n\n    /* Failed to load RAM code  */\n    case EncryptCodeError:\n        advance_software_protect_logger(ADV_ERROR, " (\u5931\u8d25 !!!!) \u52a0\u8f7d\u5931\u8d25 ...\\r\\n");\n        /* reset system */\n        advance_software_protect_system_reset();\n\n        break;\n    }\n}\n\n\nvoid advance_software_protect_init()\n{\n    /* initial */\n    advance_software_protect_encryption_code_loader(ADV_ENCRYPT_CODE_SEGMENT_ADDR, ADV_DATA_ENCRYPT_KEY, advance_software_protect_encrypt_code_sample);\n}\n')),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5bc6\u4ee3\u7801\u521d\u59cb\u5316\u4e3a\u6700\u91cd\u8981\u7684\u529f\u80fd\uff0c\u5fc5\u987b\u5728\u6240\u6709\u52a0\u5bc6\u51fd\u6570\u524d\u8c03\u7528\u524d\uff0c\u8fdb\u884c\u521d\u59cb\u5316\uff0c\u5426\u5219\u5c06\u5bfc\u81f4\u5f02\u5e38\uff0c\u6b64\u5916\uff0c\u52a0\u8f7d\u5730\u5740 \u548c \u6570\u636e\u52a0\u5bc6\u7684\u5bc6\u7801\u9700\u8981\u548c\u547d\u4ee4\u884c\u7684\u5bc6\u7801\u4e00\u81f4\uff0c\u52a0\u5165\u52a0\u5bc6\u5e93\u4e4b\u540e\uff0c\u9700\u8981\u7528PowerWriter\xae \u8fdb\u884c\u7f16\u7a0b\u540e\uff0c\u518d\u8fdb\u884c\u8c03\u8bd5\uff0c\u8be6\u89c1 ",(0,r.kt)("a",{parentName:"p",href:"#debugging"},"\u8c03\u8bd5\u4e0e\u9a8c\u8bc1")," \u3002")),(0,r.kt)("h3",{id:"object_watcher"},"5.5.4.2\uff1a\u5bf9\u8c61\u76d1\u63a7"),(0,r.kt)("p",null,"\u5bf9\u8c61\u76d1\u89c6\u5668\u53ef\u4ee5\u76d1\u63a7\u4efb\u610f\u4e00\u4e2a\u5bf9\u8c61\u6709\u6ca1\u6709\u88ab\u5f02\u5e38\u4fee\u6539\uff0c\u6bd4\u5982\u901a\u8fc7\u8c03\u8bd5\u5668\u52a8\u
16001\u4fee\u6539\u5185\u5b58\uff0c\u6216\u8005\u901a\u8fc7\u4ee3\u7801\u8865\u4e01\uff0c\u4fee\u6539\u9ed8\u8ba4\u521d\u59cb\u5316\u7684\u503c\uff0c\u6216\u8005\u662f Library \u5185\u90e8\u4ee3\u7801\uff0c\u9632\u6b62\u88abApplication \u7a0b\u5e8f\u4fee\u6539\u5185\u5b58\uff0c\u6709\u610f\u6216\u8005\u65e0\u610f\u4fee\u6539\u5230\u5176\u4ed6\u7a0b\u5e8f\u6240\u5c5e\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u76ee\u7684\u662f\u7ed5\u8fc7 Library \u7684\u67d0\u4e9b\u9650\u5236\uff0c\u6216\u8005\u662f\uff0c\u6ce8\u518c\u6743\u9650\u7b49\uff0cObject Watcher \u63d0\u4f9b\u76d1\u63a7 \u5355\u4e00\u5bf9\u8c61 (\u5982\u7ed3\u6784\u4f53\u53d8\u91cf\uff0c\u901a\u7528\u5185\u7f6e\u7c7b\u578b)\u7b49\u6570\u636e\u7684\u76d1\u63a7\uff0c\u5982\u679c\u6570\u636e\u88ab\u5916\u90e8\u7a0b\u5e8f\u4fee\u6539\uff0c\u505a\u5468\u671f\u6027\u68c0\u67e5\u7684\u65f6\u5019\u5c06\u4f1a\u4ea7\u751f\u9519\u8bef\uff0c\u7136\u540e\u6839\u636e\u5bf9\u5e94\u7684\u9519\u8bef\uff0c\u5904\u7406\u9519\u8bef\u5373\u53ef\u3002"),(0,r.kt)("h4",{id:"object_watch_sig"},"5.5.4.2.1\uff1a\u5355\u5bf9\u8c61\u76d1\u63a7"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u5b9a\u4e49\u683c\u5f0f\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"//\u6d4b\u8bd5\u7528\u7ed3\u6784\u4f53,\u91cc\u9762\u7684\u7c7b\u578b\u53ef\u4ee5\u662f\u4efb\u610f\u7c7b\u578b,\u5e76\u4e14\u65e0\u9700\u5bf9\u9f50\ntypedef struct S_Object\n{\n    uint32_t    m_sample1;\n    uint32_t    m_sample2;\n    uint32_t    m_sample3;\n    uint8_t * m_ptr8;\n}S_Object;\n\n/* \u58f0\u660e\u4e00\u4e2a\u5bf9\u8c61\u7c7b\u578b\u76d1\u63a7\u5305\u88c5\u7c7b\u578b,\u5bfc\u51fa\u7684\u7c7b\u578b\u5c06\u4e3a S_Object_Watcher */\nS_ADV_SOFTWARE_PROTECT_OBJECTWATCH_Watcher(S_Object)\n\n/* \u5b9a\u4e49\u53d7\u6258\u7ba1\u7684\u5bf9\u8c61 */\nS_Object_Watcher m_Object;\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"API:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"//\u68c0\u67e5\u5bf9\u8c61\u662f\u5426\u6b63\u5e38\nbool advance_software_protect_objectwatch_check(object,type);  //\u5176\u4e2dobject \u4e3a\u5bf9\u8c61\u7684\u6307\u9488\uff0ctype \u4e3a\u6258\u7ba1\u5bf9\u8c61\u7c7b\u578b\nbool advance_software_protect_objectwatch_update(object,type);  //\u5176\u4e2dobject \u4e3a\u5bf9\u8c61\u7684\u6307\u9488\uff0ctype \u4e3a\u6258\u7ba1\u5bf9\u8c61\u7c7b\u578b\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u6f14\u793a\u4ee3\u7801\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'/*\n *      \u5355\u4e2a\u5bf9\u8c61\u76d1\u63a7\u6f14\u793a\n */\nvoid advance_software_protect_single_object_watcher()\n{\n    #ifdef ADVANCE_SOFTWARE_PROTECT_OBJECTWATCH_ENABLE\n    advance_software_protect_logger(ADV_DEBUG," ---------------Single Object Watcher Simple Start ----------\\r\\n");\n    \n    /* \u7b2c\u4e00\u6b21\u8c03\u7528\u68c0\u67e5\u51fd\u6570,\u4f1a\u6267\u884c\u521d\u59cb\u5316 */\n    bool m_object_check_result = advance_software_protect_objectwatch_check(&m_Object,S_Object_Watcher);\n    \n    /* \u8fd4\u56de\u4e00\u5b9a\u662f\u6210\u529f\u7684 */\n    if(m_object_check_result){\n        advance_software_protect_logger(ADV_DEBUG," m_Object check passed at first time\\r\\n");\n    }else{\n        advance_software_protect_logger(ADV_ERROR," m_Object check failed at first time, Never execute at first time!\\r\\n");\n    }\n    \n    \n    /*\n     * \u6a21\u62dfObject \u88ab\u4fee\u6539\uff1a\u5982\u88ab\u8c03\u8bd5\u5668\u4fee\u6539\uff0c\u88ab\u5176\u4ed6\u7a0b\u5e8f\u4fee\u6539\uff0c\u5185\u5b58\u8865\u4e01\uff0c\u6216\u8005\u662f\u5f02\u5e38\u7b49\u539f\u56e0\uff0c\u4f46\u662f\u5916\u90e8\u5e76\u4e0d\u660e\u786e \u6b64 Object \u6709\u6821\u9a8c\u529f\u80fd\uff0c\n     * \u6545\u800c\u5e76\u6ca1\u6709\u66f4\u65b0 Object \u7684\u6821\u9a8c\u4fe1\u606f\uff0c\u8fd9\u5c06\u5bfc\u81f4\u5468\u671f\u6027\u7684 Check \u89e6\u53d1\u5f02\u5e38.\n     */\n    m_Object.m_Object.m_sample1 = 1;\n    m_Object.m_Object.m_sample2 = 2;\n    m_Object.m_Object.m_sample3 = 3;\n    m_Object.m_Object.m_ptr8 = (uint8_t *)0x12345678;
1\n    \n    m_object_check_result = advance_software_protect_objectwatch_check(&m_Object,S_Object_Watcher);\n    \n    /* \u7ed3\u679c\u5c06\u4f1a\u89e6\u53d1\u5f02\u5e38 */\n    if(m_object_check_result){\n        advance_software_protect_logger(ADV_DEBUG," m_Object has been modified but there is no update validation, which is not performed here\\r\\n");\n    }else{\n        advance_software_protect_logger(ADV_ERROR," m_Object will fail if it is modified without updating the checksum value!\\r\\n");\n    }\n    \n    \n    /* \u66f4\u65b0\u5bf9\u8c61\u7684\u6821\u9a8c\u503c\uff0c\u518d\u68c0\u67e5, \u5c06\u4f1a\u901a\u8fc7 \uff0c\u6b63\u5e38\u9879\u76ee\u5f00\u53d1\u65f6\uff0c\u6258\u7ba1\u5bf9\u8c61\u540e\uff0c\u66f4\u65b0\u5b8c \u5bf9\u8c61\u4e2d\u7684\u6210\u5458\u540e\uff0c\u518d\u987a\u4fbf\u66f4\u65b0\u5bf9\u8c61\u6821\u9a8c\u4fe1\u606f \uff0c\u5728\u5468\u671f\u7684\u68c0\u67e5\u4e2d\u5c06\u4e0d\u4f1a\u89e6\u53d1\u9519\u8bef */\n    advance_software_protect_objectwatch_update(&m_Object,S_Object_Watcher);        /* update checksum */\n    \n    m_object_check_result = advance_software_protect_objectwatch_check(&m_Object,S_Object_Watcher); \n    \n    /* \u5c06\u4f1a\u901a\u8fc7 */\n    if(m_object_check_result){\n        advance_software_protect_logger(ADV_DEBUG," m_Object had modified & updated, will be passed !\\r\\n");\n    }else{\n        advance_software_protect_logger(ADV_ERROR," m_Object had modified & updated, never failed !\\r\\n");\n    }\n    \n    advance_software_protect_logger(ADV_DEBUG," ---------------Single Object Watcher Simple End----------\\r\\n");\n    #endif\n}\n')),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Object Watcher \u53ea\u6821\u9a8c\u5bf9\u8c61\u5b9e\u4f53\u6570\u636e\u672c\u8eab\uff0c\u4e0d\u4f1a\u5c06\u7ed3\u6784\u4f53\u4e2d\u7684\u6307\u9488\u6307\u5411\u7684\u5bf9\u8c61\u5305\u542b\u5728\u6821\u9a8c\u4e2d\uff0c\u5982\u679c\u9700\u8981\u76d1\u63a7\u6307\u9488\u7684\u6307\u9488\uff0c\u8bf7\u4f7f\u7528\u52a8\u6001\u5bf9\u8c61\u76d1\u63a7\u6a21\u5f0f\u3002")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u672c\u9879\u76ee\u793a\u4f8b\u5de5\u7a0b\u91c7\u7528\u6807\u51c6crc32 \u6821\u9a8c\u7b97\u6cd5\uff0c\u5b9e\u9645\u9879\u76ee\u53ef\u66f4\u6362\u66f4\u6362\u4e00\u5957\u81ea\u5df1\u7684\u6821\u9a8c\u65b9\u6cd5. \u6821\u9a8c\u65b9\u6cd5\u63a5\u53e3\u5728 advance_software_protect_port.c (advance_software_protect_crc32) \u4e2d\u3002")))),(0,r.kt)("h4",{id:"object_watch_list"},"5.5.4.2.2\uff1a\u52a8\u6001\u5bf9\u8c61\u76d1\u63a7"),(0,r.kt)("p",null,"\u200b    \u5355\u4e2a\u5bf9\u8c61\u76d1\u63a7\u53ef\u4ee5\u63d0\u4f9b\u4e00\u4e2a\u7b80\u5355\u7684\u76d1\u63a7\u76ee\u6807\uff0c\u9488\u5bf9\u590d\u6742\u5ea6\u4e0d\u9ad8\u7684\u7cfb\u7edf\uff0c\u7b80\u5355\u6613\u7528\uff0c\u9488\u5bf9\u590d\u6742\u7684\u7cfb\u7edf\uff0c\u4e3a\u4e86\u964d\u4f4e \u5185\u5b58\u76d1\u63a7 \u529f\u80fd\u7684\u4f7f\u7528\u96be\u5ea6,\u4ee5\u53ca\u5c3d\u53ef\u80fd\u51cf\u5c11\u5bf9\u73b0\u6709\u4ee3\u7801\u7684\u4fee\u6539\uff0c\u6b64\u65f6\u4fbf\u63d0\u4f9b\u4e86 \u5bf9\u8c61\u76d1\u63a7\u6258\u7ba1\u529f\u80fd\uff0c\u5305\u542b\u5e38\u89c1\u7684\u529f\u80fd\uff1a \u6dfb\u52a0\u5bf9\u8c61\u5230\u6258\u7ba1\u6c60\uff0c\u4ece\u6258\u7ba1\u6c60\u4e2d\u5220\u9664\u5bf9\u8c61\uff0c\u66f4\u65b0\u6258\u7ba1\u6c60\u4e2d\u7684\u67d0\u4e2a\u5bf9\u8c61\uff0c\u66f4\u65b0\u6258\u7ba1\u6c60\u4e2d\u7684 \u67d0\u4e2a\u5bf9\u8c61\uff0c\u66f4\u65b0\u6258\u7ba1\u6c60\u4e2d\u7684\u6240\u6709\u5bf9\u8c61 \u7b49\u529f\u80fd\u3002"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"API \u5217\u8868\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"/* Object Watcher Exception type */\ntypedef enum E_ObjectWatchException\n{\n    ObjectParamError = 0,   /* \u53c2\u6570\u9519\u8bef */\n    ObjectMemoryError,      /* \u5185\u5b58\u9519\u8bef */\n    ObjectAlreadyExits,     /* \u5f53\u524d\u5bf9\u8c61\u5df2\u5728\u76d1\u63a7\u5217\u8868\u4e2d */\n    ObjectModified,         /* \u5bf9\u8c61\u88ab\u5f02\u5e38\u8bbf\u95ee */\n} E_ObjectWatchException;\n\n/* callback for object watcher */\ntypedef void (*ObjectWatcherCallback)(E_ObjectWatchException exception,void * object);
1\n\n//\u8bbe\u7f6e\u76d1\u63a7\u56de\u8c03\nvoid advance_software_protect_objectwatch_list_set_callback(ObjectWatcherCallback eventCallback);\n//\u67e5\u627e\u67d0\u4e2a\u5bf9\u8c61\u662f\u5426\u5728\u6258\u7ba1\u4e2d\uff0c\u53c2\u6570\u4e3a\u5bf9\u8c61\u7684\u6307\u9488\nbool advance_software_protect_objectwatch_list_find(void * object_ptr);\n//\u6258\u7ba1\u4e00\u4e2a\u5bf9\u8c61\uff0c\u53c2\u6570\u4e3a\uff1a\u5bf9\u8c61\u6307\u9488\u3001\u5bf9\u8c61\u7684\u5927\u5c0f\u3001\u5f53\u4ece\u6258\u7ba1\u4e2d\u79fb\u9664\u65f6\u662f\u5426\u540c\u65f6\u5220\u9664\u5bf9\u8c61\u5b9e\u4f53(\u4ec5\u9002\u7528\u52a8\u6001\u5206\u914d\u7684\u5bf9\u8c61)\nbool advance_software_protect_objectwatch_list_add(void * object_ptr, size_t object_size,bool del_object_when_remove);\n//\u83b7\u53d6\u6258\u7ba1\u5bf9\u8c61\u7684\u6570\u91cf\nsize_t advance_software_protect_objectwatch_list_size(void);\n//\u6258\u7ba1\u961f\u5217\u4e2d\u5220\u9664\u79fb\u52a8\u67d0\u4e2a\u5bf9\u8c61\uff0c\u53c2\u6570\u4e3a\u5bf9\u8c61\u6307\u9488\nbool advance_software_protect_objectwatch_list_remove(void * object_ptr);\n//\u6e05\u7a7a\u6240\u6709\u6258\u7ba1\u7684\u5bf9\u8c61 \nvoid advance_software_protect_objectwatch_list_reset(void);\n//\u68c0\u67e5\u67d0\u4e00\u4e2a\u5bf9\u8c61\u662f\u5426\u88ab\u4fee\u6539,\u53c2\u6570\u4e3a\u5bf9\u8c61\u6307\u9488\u3002\nbool advance_software_protect_objectwatch_list_check(void * object_ptr);\n //\u68c0\u67e5\u6258\u7ba1\u5bf9\u8c61\u4e2d\u7684\u6240\u6709\u5bf9\u8c61\uff0c\u8fd4\u56de\u503c\u4e3a\uff1a\u68c0\u67e5\u901a\u8fc7\u7684\u6570\u91cf\uff0c(\u6ce8\u610f\uff1a\u5982\u679c\u6ce8\u518c\u4e86\u4e8b\u4ef6\u56de\u8c03\u63a5\u53e3\uff0c\u5c06\u4f1a\u901a\u8fc7\u4e8b\u4ef6\u63a5\u53e3\u6253\u5370\u5931\u8d25\u7684\u8be6\u60c5)\nsize_t advance_software_protect_objectwatch_list_check_all(void);\n //\u66f4\u65b0\u67d0\u4e00\u4e2a\u5bf9\u8c61\u7684\u6821\u9a8c\u503c\uff0c\u53c2\u6570\u4e3a\u5bf9\u8c61\u6307\u9488\nbool advance_software_protect_objectwatch_list_update(void * object_ptr);\n //\u66f4\u65b0\u6240\u6709\u5bf9\u8c61\u7684\u6821\u9a8c\u503c\nvoid advance_software_protect_objectwatch_list_update_all(void);\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Object  Watcher List \u6f14\u793a\u4ee3\u7801"),"\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'/* \u5b9a\u4e49\u7528\u4e8e\u52a8\u6001\u6258\u7ba1\u7684\u5bf9\u8c61  */\nS_Object        m_object;\nS_A             m_aType;\nS_B             m_bType;\nS_Class         m_class;\n\n/* \u7528\u4e8e\u52a8\u6001\u6258\u7ba1\u7684\u4e8b\u4ef6\u56de\u8c03\u63a5\u53e3 */\nvoid advance_software_protect_dynamic_muti_object_watcher_callback(E_ObjectWatchException excep, void* param)\n{\n    switch(excep)\n    {\n    /* \u53c2\u6570\u9519\u8bef\u4e3a\u4e00\u822c\u6027\u9519\u8bef\uff0c\u63d0\u793a\u53c2\u6570\u6709\u95ee\u9898 */\n    case ObjectParamError:\n        advance_software_protect_logger(ADV_WARN, " Error param ...\\r\\n");\n        break;\n    /* \u63d0\u793a\u67d0\u4e00\u4e2a\u5bf9\u8c61\u88ab\u4fee\u6539\u4e86, \u8bf7\u53ca\u65f6\u5904\u7406\u5f02\u5e38\uff0c\u9632\u6b62\u8f6f\u4ef6\u88ab\u7834\u89e3\uff0cparam \u6307\u5411\u5bf9\u8c61\u9996\u5730\u5740  */\n    case ObjectModified:\n        advance_software_protect_logger(ADV_ERROR, " [0x%08X] Object was modified!\\r\\n", (uint32_t)param);\n        break;\n    /* \u5bf9\u8c61\u5df2\u7ecf\u5b58\u5728\u4e8e\u6258\u7ba1\u5217\u8868\u4e2d\uff0c\u91cd\u590d\u6dfb\u52a0\u65f6\u63d0\u793a */\n    case ObjectAlreadyExits:\n        advance_software_protect_logger(ADV_WARN, " [0x%08X] Object already exist!\\r\\n", (uint32_t)param);\n        break;\n    /* \u5185\u5b58\u4e0d\u8db3\uff0c\u63d0\u793a Heap \u5185\u5b58 \u5206\u914d\u592a\u5c0f */\n    case ObjectMemoryError:\n        advance_software_protect_logger(ADV_ERROR, " Memory space is used up!\\r\\n");\n        break;\n    }\n}\n\nvoid advance_software_protect_dynamic_muti_object_watcher()\n{\n\n\n    advance_software_protect_logger(ADV_DEBUG, " ---------- Dynamic Muti-Object Watcher Simple Start ----------\\r\\n");\n\n    /* \u8bbe\u7f6e\u4e8b\u4ef6\u56de\u8c03\u63a5\u53e3\uff1a\u53ef\u9009\uff0c\u8bbe\u7f6e\u56de\u8c03\u63a5\u53e3\u53ef\u4ee5\u62ff\u5230\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f */\n\n    advance_softw
1are_protect_logger(ADV_DEBUG, " Set ObjectWatcher Event callback...\\r\\n");\n    advance_software_protect_objectwatch_list_set_callback(advance_software_protect_dynamic_muti_object_watcher_callback);\n\n\n    /* \u52a8\u6001\u6dfb\u52a0\u5bf9\u8c61\u5230\u6258\u7ba1\u5217\u8868\u4e2d */\n    advance_software_protect_objectwatch_list_add(&m_object, sizeof(m_object), false);\n    advance_software_protect_objectwatch_list_add(&m_aType, sizeof(m_aType), false);\n    advance_software_protect_objectwatch_list_add(&m_bType, sizeof(m_bType), false);\n    advance_software_protect_objectwatch_list_add(&m_class, sizeof(m_class), false);\n    //\u91cd\u590d\u6dfb\u52a0\u5c06\u4f1a\u4ea7\u751f\u5f02\u5e38 (ObjectAlreadyExits)\n    advance_software_protect_objectwatch_list_add(&m_class, sizeof(m_class), false);    \n    //\u53c2\u6570\u9519\u8bef\u5f02\u5e38 (ObjectParamError)\n    advance_software_protect_objectwatch_list_add(0, sizeof(m_class), false);                   \n\n    //\u52a8\u6001\u6dfb\u52a0\u591a\u4e2a\u5bf9\u8c61\u5e76\u81ea\u52a8\u6258\u7ba1\u5185\u5b58\u91ca\u653e\n    for(size_t i = 0; i < 200; i++)\n    {\n        S_Class* m_new_obj = (S_Class*)malloc(sizeof(S_Class));\n        if(m_new_obj)\n        {\n            //\u5f53\u79fb\u9664\u6258\u7ba1\u65f6\uff0c\u540c\u65f6\u4e5f\u5220\u9664\u5bf9\u8c61\u5b9e\u4f53\uff0c\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u8bbe\u7f6e\u4e3atrue\n            advance_software_protect_objectwatch_list_add(m_new_obj, sizeof(S_Class), true);    \n        }\n        else\n        {\n            //\u5185\u5b58\u4e0d\u8db3\n            //...\n            break;\n        }\n    }\n\n    /* \u67e5\u627e\u4e00\u4e2a\u5bf9\u8c61\u662f\u5426\u5728\u6258\u7ba1\u4e2d */\n    bool m_find = advance_software_protect_objectwatch_list_find(&m_aType);\n    if(m_find)\n    {\n        advance_software_protect_logger(ADV_INFO, " m_aType exist..\\r\\n");\n    }\n    else\n    {\n        advance_software_protect_logger(ADV_INFO, " m_aType not exist..\\r\\n");\n    }\n\n\n\n    /* \u7edf\u8ba1\u6258\u7ba1\u5bf9\u8c61\u7684\u6570\u91cf */\n    advance_software_protect_logger(ADV_DEBUG, " Total %d objects in watching..\\r\\n", advance_software_protect_objectwatch_list_size());\n\n    /* \u6821\u9a8c\u5355\u4e2a\u5bf9\u8c61 */\n    bool m_check = advance_software_protect_objectwatch_list_check(&m_class);\n    if(m_check)\n    {\n        advance_software_protect_logger(ADV_DEBUG, " m_class check passed ..\\r\\n");\n    }\n    else\n    {\n        //failed...\n        //...\n    }\n\n    /* \u6821\u9a8c\u6240\u6709\u5bf9\u8c61 */\n    m_class._data_.m_a.m_data.m_sample1 ^= 0xAB;        //\u6a21\u62df\u5916\u90e8\u4fee\u6539\u4e86\u5185\u5b58\n\n    size_t m_passed_count = advance_software_protect_objectwatch_list_check_all();  //\u5931\u8d25\u7684\u5bf9\u8c61\u5c06\u4f1a\u901a\u8fc7\u4e8b\u4ef6\u56de\u8c03\u63a5\u53e3\u6253\u5370\u8be6\u60c5\n    size_t m_total_count = advance_software_protect_objectwatch_list_size();\n    //\u5224\u65ad\u901a\u8fc7\u7684\u548c\u603b\u6570\u662f\u5426\u76f8\u7b49.\u6765\u51b3\u5b9a\u5931\u8d25\u8fd8\u662f\u6210\u529f\uff0c\n    if(m_passed_count == m_total_count)\n    {\n        advance_software_protect_logger(ADV_DEBUG, " All objects check passed ..\\r\\n");\n    }\n    else\n    {\n        advance_software_protect_logger(ADV_DEBUG, " Passed: %d, Failed : %d ..\\r\\n", m_passed_count, m_total_count);\n    }\n\n    /* \u66f4\u65b0\u5355\u4e2a\u5bf9\u8c61\u6821\u9a8c\u503c, \u6b63\u5e38\u4ee3\u7801 */\n    if(advance_software_protect_objectwatch_list_update(&m_class))\n    {\n        advance_software_protect_logger(ADV_DEBUG, " m_class update ok ..\\r\\n");\n    }\n    else\n    {\n        advance_software_protect_logger(ADV_DEBUG, " m_class update failed ..\\r\\n");\n    }\n    advance_software_protect_logger();  //\u518d\u6b21\u5168\u90e8\u68c0\u67e5\u65f6\uff0c\u5c06\u4f1a\u901a\u8fc7\n\n\n    /* \u5220\u9664\u5355\u4e2a\u5bf9\u8c61 */\n    bool m_del = advance_software_protect_objectwatch_list_remove(&m_bType);\n    if(m_del)\n    {\n        advance_software_protect_logger(ADV_INFO, " m_bType removed, left %d object in watching..\\r\\n", advance_softw
1are_protect_objectwatch_list_size());\n    }\n    else\n    {\n        advance_software_protect_logger(ADV_INFO, " m_bType not exist!..\\r\\n");\n    }\n    /* \u66f4\u65b0\u6240\u6709\u5bf9\u8c61 */\n    advance_software_protect_objectwatch_list_update_all();\n    advance_software_protect_logger(ADV_INFO, " All objects updated...\\r\\n");\n\n    /* \u5220\u9664\u6240\u6709\u5bf9\u8c61 */\n    advance_software_protect_objectwatch_list_reset();\n    advance_software_protect_logger(ADV_INFO, " All objects removed, left %d object in watching..\\r\\n", advance_software_protect_objectwatch_list_size());\n\n    advance_software_protect_logger(ADV_DEBUG, " ---------------Dynamic Muti-Object Watcher Simple End----------\\r\\n");\n\n}\n')),(0,r.kt)("h4",{id:"object_watch_list_note"},"5.5.4.2.3\uff1a\u8865\u5145\u8bf4\u660e"),(0,r.kt)("p",null,"Object Watcher \u7684\u76ee\u7684\u662f\u76d1\u63a7\u5185\u5b58\u662f\u5426\u88ab\u5f02\u5e38\u4fee\u6539\uff0c\u4f7f\u7528\u6d41\u7a0b"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u4f7f\u7528\u5355\u4e00\u5bf9\u8c61\u5305\u88c5\u5b8f\u76d1\u63a7\u4e00\u4e2a\u5bf9\u8c61\u3001\u6216\u8005\u4f7f\u7528\u6258\u7ba1\u65b9\u6cd5\u52a8\u6001\u6dfb\u52a0\u76d1\u63a7\u5bf9\u8c61\u3002")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"setter \u65b9\u6cd5\uff1a\u9879\u76ee\u4ee3\u7801\u5728\u66f4\u65b0\u5bf9\u8c61\u5185\u90e8\u5c5e\u6027\u65f6\uff0c\u540c\u65f6\u66f4\u65b0\u5bf9\u8c61\u7684\u6821\u9a8c\u503c\uff0c\u4f7f\u7528update \u65b9\u6cd5\u3002")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"getter \u65b9\u6cd5\uff1a\u9879\u76ee\u4ee3\u7801\u5728\u53d6\u7528\u5bf9\u8c61\u5185\u90e8\u5c5e\u6027\u65f6\uff0c\u8c03\u7528check \u65b9\u6cd5\u6765\u68c0\u67e5\u6570\u636e\u662f\u5426\u88ab\u5f02\u5e38\u4fee\u6539\u3001\u4ece\u800c\u5224\u65ad\u6709\u65e0\u5f02\u5e38\u8bbf\u95ee\u3001\u5982\u5916\u90e8\u4f7f\u7528\u4e86\u8c03\u8bd5\u5668\u76f4\u63a5\u8bbe\u7f6e\u4e86\u65ad\u70b9\uff0c \u5f3a\u884c\u505c\u6b62\u8fd0\u884c\u3001\u4fee\u6539\u5173\u952e\u5185\u5b58\u6570\u636e\u3001\u5e94\u7528\u5c42\u4fee\u6539\u5230\u4e86\u534f\u8bae\u5c42\u7684\u6570\u636e\u3001Object Watcher \u53ef\u4ee5\u7528\u4e8e\u6b64\u76ee\u7684\u3002")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"\u5173\u4e8e\u5bf9\u8c61\u4e2d\u7684\u6307\u9488\u5982\u4f55\u5904\u7406\uff1a\u5982\u679c\u60f3\u76d1\u63a7\u5bf9\u8c61\u5b9e\u4f53\u5185\u90e8\u7684\u6307\u9488\u6307\u5411\u7684\u5bf9\u8c61\uff0c\u8bf7\u8bb2\u6307\u9488\u6307\u5411\u7684\u5bf9\u8c61\u518d\u6b21\u6258\u7ba1\u5230 \u76d1\u63a7\u5217\u8868\u4e2d\u5373\u53ef\uff0c\u591a\u4e2a\u5206\u652f\u91c7\u7528\u4e00\u6837\u7684\u64cd\u4f5c\u6d41\u7a0b,\u5982\u4e0b\u6240\u793a"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"struct A\n{\n    int a;\n};\n\nstruct B\n{\n    int         b;\n    struct A *  sa;\n       \n}\n\nstruct A m_a;\nstruct B m_b = \n{\n    .b = 10,\n    .sa = &m_a;\n};\n\n//\u4e0a\u9762\u7684m_b \u5bf9\u8c61\u6258\u7ba1\u65f6\uff0c\u5982\u4f55\u6258\u7ba1 m_b.sa?\n\n//\u793a\u4f8b\uff1a\nadvance_software_protect_objectwatch_list_add(&m_b, sizeof(m_b), false);\nadvance_software_protect_objectwatch_list_add(m_b.sa, sizeof(m_b.sa), false);   //\u6307\u9488\u518d\u6b21\u6258\u7ba1\uff0c\u5373\u53ef\u76d1\u63a7\u5bf9\u8c61m_a, \u4e5f\u53ef\u4ee5\u76f4\u63a5\u6258\u7ba1m_a\n\n")),(0,r.kt)("h3",{id:"signature"},"5.5.4.3\uff1a\u56fa\u4ef6\u7b7e\u540d"),(0,r.kt)("p",null,"\u4e3a\u4e86\u9632\u6b62\u82af\u7247\u56fa\u4ef6\u88ab\u76f4\u63a5\u62f7\u8d1d\uff0c\u5c06\u56fa\u4ef6\u4e0e\u7279\u5b9a\u82af\u7247\u8fdb\u884c\u7ed1\u5b9a\u6216\u8005\u8ba4\u8bc1\u662f\u5fc5\u987b\u7684\uff0cPowerWriter\xae \u63d0\u4f9b\u4e86Matrix \u56fa\u4ef6\u7b7e\u540d\u529f\u80fd\uff0c\u4f7f\u7528\u65b9\u6cd5\u8be6\u89c1\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://docs.PowerWriter.com/docs/next/icwkey/quick-start/icwkey-matrix"},"3.4 Matrix\u793a\u4f8b | PowerWriter\xae\u6587\u6863\u4e2d\u5fc3"),"\uff0c\u4ee5\u53ca ECDSA \u6570\u5b57\u7b7e\u540d\u529f\u80fd\uff0c\u4f7f\u7528\u65b9\u6cd5\u8be6\u89c1 ",(0,r.kt)("a",{parentName:"p",href:"https://docs.PowerWriter.com/docs/next/icwkey/quick-start/icwkey-sample"},"3.3 ECDSA\u793a\u4f8b | PowerWriter\xae\u6587\u6863\u4e2d\u5fc3"),"\uff0c\u5728\u5f53\u524d\u52a0\u5bc6\u5e93\u4e2d\uff0c\u8fd9\u4e24\u79cd\u7b7e\u540d\u65b9\u6cd5\u5747\u5df2\u5305\u542b\uff0c\u76f8\u5f53\u4e8ePowerWriter\xae \u7684\u6807\u51c6\u6a21\u5f0f\uff0c\u52a0\u5bc6\u5e93\u5728\u539f\u6709\u7684\u57fa\u7840\u4e0a\uff0c\u5c06\u4f1a\u5bf9\u7b7e\u540d\u9a8c\u8bc1\u4ee3\u7801\u3001UID \u8bfb\u53d6\u4ee3\u7801\u8fdb\u884c\u51fd\u6570\u7ea7\u52a0\u5bc6\u3001\u914d\u5408\u56fa\u4ef6\u6821\u9a8c\u529f\u80fd\u3001\u5bf9\u8c61\u76d1\u63a7\u529f\u80fd\uff0c\u53ef\u5728\u76f8\u5f53\u9ad8\u7684\u7a0b\u5ea6\u4e0a\uff0c\u9632\u6b62\u56fa\u4ef6\u88ab\u53cd\u7f16\u8bd1\u3001\u52a8\u6001\u5206\u6790\u3001\u52a8\u6001\u8c03\u8bd5\uff0c\u672c\u8282\u5185\u5bb9\uff0c\u9700\u8981\u5f00\u53d1\u8005\u5148\u719f\u6089 Matrix \u548c ECDSA \u7b7e\u540d\u7684\u4f20\u7edf\u7528\u6cd5\uff0c\u5982\u4e0d\u719f\u6089\u4ee5\u4e0a\u4e24\u79cd\u7b7e\u540d\u7684\u4f7f\u7528\u6d41\u7a0b\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u6587\u6863\u6559\u7a0b\uff0c\u7136\u540e\u518d\u505a\u52a0\u5bc6\u5e93\u7684\u96c6\u62
110\u3002"),(0,r.kt)("p",null,"\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u6211\u4eec\u5148\u914d\u7f6e Matrix \u548c ECDSA \u7684\u516c\u5171\u5b9a\u4e49\uff0c\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib/advance_software_protect_user.h")," \u7528\u6237\u5934\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u627e\u5230\u5982\u4e0b\u5b9a\u4e49"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'/* \u6df7\u6dc6\u7528\u7684\u968f\u673a\u6570\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u5fc5\u987b\u8fdb\u884c\u8c03\u6574\uff0c\u4ee5\u7528\u4e8e\u6df7\u6dc6\u5173\u952e\u4fe1\u606f */\n#define ASP_RAND_FACTOR (0x45623513)\n\n/* \u82af\u7247UID \u5730\u5740 */\n#define UID_CHIP_ADDR (0x1FFFF7E8)     /* \u53c2\u8003\u5bfc\u51fa\u5934\u6587\u4ef6 cortex_chipid_binding.h \u4e2d (UID_CHIP_ADDR_MIX ^ UID_CHIP_ADDR) */\n#define UID_CHIP_SIZE (12)             /* \u53c2\u8003 cortex_chipid_binding.h \u4e2d\u7684 UID_CHIP_SIZE */\n#define UID_KEYADDR_PLACEHOLDER_EN (1) /* \u662f\u5426\u5f00\u542f\u7b7e\u540d\u4fe1\u606f\u9884\u5b9a\u4e49\uff0c\u5f00\u542f\u540e\u53ef\u5728\u5bf9\u5e94\u5730\u5740\u9884\u5206\u914d\u7a7a\u95f4\uff0c\u5efa\u8bae\u5f00\u542f */\n\n#define UID_KEYADDR_INNER_VAL (0x08002000) /* \u7b7e\u540d\u5b58\u50a8\u5730\u5740  */\n#ifdef ADVANCE_SOFTWARE_PROTECT_COMPILER_MDK\n#define UID_KEYADDR_INNER ".ARM.__at_0x08002000" /* \u7b7e\u540d\u5b58\u50a8\u5730\u5740\u5728MDK \u4e2d\u7684\u5b9a\u4e49\u5f62\u5f0f */\n#elif defined ADVANCE_SOFTWARE_PROTECT_COMPILER_GCC\n#define UID_KEYADDR_INNER ".asp_signature_license" /* \u7b7e\u540d\u5b58\u50a8\u5730\u5740\u5728 GCC\u4e2d\u7684 segment,\u8bf7\u4e0d\u8981\u4fee\u6539\u6b64\u5b9a\u4e49\uff0c\u5177\u4f53\u53c2\u8003GCC \u7684\u914d\u7f6e  */\n#endif\n')),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u4ee5\u4e0a\u529f\u80fd\u5b9a\u4e49\uff0c\u9700\u8981\u6839\u636ePowerWriter\xae \u6216\u8005 ICWKEY \u7684\u9879\u76ee\u914d\u7f6e\u8fdb\u884c\u8c03\u6574\uff0c\u6ce8\u610f\u8bf7\u7559\u610f\u6ce8\u91ca\u5185\u5bb9 \uff0cMatrix \u548c ECDSA \u7684\u6559\u7a0b\u6e90\u7801\u4e2d\u6709\u8be6\u7ec6\u4ecb\u7ecd\u3002 ")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u5b9e\u73b0CID \u8bfb\u53d6API\uff0c\u5e76\u5c06\u5176\u51fd\u6570\u58f0\u660e\u4e3a\u52a0\u5bc6\u51fd\u6570\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_porting.c"',title:'"lib/advance_software_protect_porting.c"'},"/* for signature */\n#ifdef ADVANCE_SOFTWARE_PROTECT_SIGNATURE_ENABLE\n/*\n * @brief   Gets the chip ID of the current chip.\n * @pram      id_data   : A buffer that stores ids\n *                  size    : id length\n * @retval void\n */\nASP_ENCRYPT_F_DECL(void advance_software_protect_get_cid(uint32_t *id_addr, uint8_t size,uint32_t *id_data))\nvoid advance_software_protect_get_cid(uint32_t *id_addr, uint8_t size, uint32_t *id_data)\n{\n    // If the ID is discontinuous, you need to handle it yourself...\n    // offset 0x00,0x04,0x14 ( Such as STM32L0, STM32L1, STM32L4 etc)\n#if ((defined STM32L0) || (defined STM32L1) || (defined STM32L4))\n    id_data[0] = *(id_addr + (0x00 / 4));\n    id_data[1] = *(id_addr + (0x04 / 4));\n    id_data[2] = *(id_addr + (0x14 / 4));\n#else\n    // The ID is continuous...\n    for (int i = 0; i < (size / 4); i++){\n        *id_data++ = *id_addr++;\n    }\n#endif\n}\n#endif\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u6dfb\u52a0\u7b7e\u540d\u9a8c\u8bc1\u4ee3\u7801\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'#ifdef ADVANCE_SOFTWARE_PROTECT_SIGNATURE_ENABLE\n\nvoid advance_software_protect_signature()\n{\n    advance_software_protect_logger(ADV_DEBUG, " ---------------Product Signature start----------\\r\\n");\n    if (advance_software_protect_verify_authorization(&m_signature_config))\n    {\n        advance_software_protect_logger(ADV_DEBUG, " Chip signature verify passed...\\r\\n");\n    }\n    else\n    {\n        advance_software_protect_logger(ADV_ERROR, " Chip signature verify failed!!!!!\\r\\n");\n    }
1\n    advance_software_protect_logger(ADV_DEBUG, " ---------------Product Signature end----------\\r\\n");\n        \n        \n}\n#endif\n\nASP_ENCRYPT_F_DECL(void advance_software_protect_sample())\nvoid advance_software_protect_sample()\n{\n    /* chip signature */\n#ifdef ADVANCE_SOFTWARE_PROTECT_SIGNATURE_ENABLE\n        advance_software_protect_signature();\n#endif\n\n}\n\n')),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u7b7e\u540d\u9a8c\u8bc1\u7684\u5173\u952e\u51fd\u6570\uff0c\u5efa\u8bae\u58f0\u660e\u4e3a\u52a0\u5bc6\u51fd\u6570\u3002")),(0,r.kt)("h4",{id:"signature_matrix"},"5.5.4.3.1\uff1a\u4f7f\u7528 Matrix \u7b7e\u540d"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u542f\u7528 Matrix \u7b7e\u540d\u914d\u7f6e\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_user.h"',title:'"lib/advance_software_protect_user.h"'},"/* Signature */\n#define ADVANCE_SOFTWARE_PROTECT_SIGNATURE_MATRIX /* using matrix as signature */\n//#define ADVANCE_SOFTWARE_PROTECT_SIGNATURE_ECDSA /* using ecdsa as signature */\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u8c03\u6574Matrix \u7b7e\u540d\u914d\u7f6e\uff1a")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250111095505538",src:n(8842).Z,width:"276",height:"54"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_user.h"',title:'"lib/advance_software_protect_user.h"'},"#define UID_KEY_LENGTH (12)          /* refer to UID_KEY_LENGTH in cortex_chipid_binding.h  */\n#define UID_DATAENDIAN littleEndian  /* refer to UID_DATAENDIAN in cortex_chipid_binding.h */\n#define UID_USERID_KEY1 (0x53A886F5) /* refer to UserID 1 in cortex_chipid_binding.h */\n#define UID_USERID_KEY2 (0x5D71DDB3) /* refer to UserID 2 in cortex_chipid_binding.h */\n#define UID_USERID_KEY3 (0x32677FE8) /* refer to UserID 3 in cortex_chipid_binding.h */\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250111095524300",src:n(31186).Z,width:"690",height:"312"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_porting.c"',title:'"lib/advance_software_protect_porting.c"'},"ASP_ENCRYPT_F_DECL(static void ChipUIDAlgo(char pUserID[], char pChipID[], char pKey[]))\n    \n//The following code may warn in KEIL(MDK), ignore it\nstatic void ChipUIDAlgo(char pUserID[], char pChipID[], char pKey[])\n{\n    pKey[0] = pUserID[8] | pChipID[5] - pUserID[10] + pChipID[2] ;\n    pKey[1] = pChipID[1] & pChipID[0] ^ pUserID[4] * pChipID[11] ;\n    pKey[2] = pChipID[3] ^ pChipID[10] | pChipID[6] - pUserID[11] ;\n    pKey[3] = pUserID[9] & pChipID[4] + pUserID[6] * pUserID[0] ;\n    pKey[4] = pChipID[7] + pUserID[1] * pChipID[9] - pUserID[7] ;\n    pKey[5] = pUserID[2] & pUserID[3] ^ pUserID[5] | pChipID[8] ;\n    pKey[6] = pChipID[6] * pChipID[4] & pUserID[6] + pChipID[11] ;\n    pKey[7] = pChipID[1] ^ pUserID[0] - pUserID[5] | pUserID[7] ;\n    pKey[8] = pChipID[8] - pUserID[10] | pChipID[2] * pUserID[2] ;\n    pKey[9] = pChipID[10] & pUserID[11] + pChipID[5] ^ pUserID[4] ;\n    pKey[10] = pUserID[9] & pUserID[3] ^ pChipID[7] - pChipID[0] ;\n    pKey[11] = pChipID[3] + pUserID[8] | pUserID[1] * pChipID[9] ;\n}\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u8bf7\u6ce8\u610f\uff0c\u7b7e\u540d\u8ba1\u7b97\u4ee3\u7801\uff0c\u58f0\u660e\u4e3a\u52a0\u5bc6\u51fd\u6570\u3002")),(0,r.kt)("h4",{id:"signature_ecdsa"},"5.5.4.3.2\uff1a\u4f7f\u7528 ECDSA \u7b7e\u540d"),(0,r.kt)("p",null,"\u914d\u7f6e ECDSA \u516c\u94a5\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250111100422421",src:n(5288).Z,width:"633",height:"291"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_user.h"',title:'"lib/advance_software_protect_user.h"'},"    /* using ecdsa to signature */\n    // Public key\n    const static uint8_t PUBLIC_KEY[49] = {\n        0x04, 0x58, 0x82, 0x74, 0x51, 0x40, 0x7E, 0xEF, 0x99, 0x94, 0x7A, 
10x66, 0xA6, 0x80, 0x07, 0x1B,\n        0xE4, 0xED, 0x5C, 0xD4, 0x68, 0xDB, 0xBC, 0xDB, 0x12, 0x7B, 0x5B, 0xE0, 0xA7, 0x85, 0xFA, 0xD1,\n        0x33, 0x61, 0x91, 0xB8, 0x37, 0x6B, 0x24, 0xC3, 0x82, 0xB5, 0x48, 0x10, 0x94, 0x32, 0x39, 0xB5,\n        0x46};\n")),(0,r.kt)("h4",{id:"signature_demo"},"5.5.4.3.2\uff1a\u7b7e\u540d\u793a\u4f8b\u5de5\u7a0b"),(0,r.kt)("p",null,"\u4e3a\u4e86\u964d\u4f4e\u5f00\u53d1\u8005\u7684\u7591\u8651\uff0c\u6211\u4eec\u51c6\u5907\u4e86\u793a\u4f8b ICWKEY \u548c PowerWriter\xae \u7684Demo \u5de5\u7a0b\u9879\u76ee\uff0c\u5173\u4e8eMatrix \u548c ECDSA \u7684\u914d\u7f6e\u5747\u5728\u4ee5\u4e0b\u8def\u5f84\u4e2d ",(0,r.kt)("inlineCode",{parentName:"p"},"/sample/")," \u6587\u4ef6\u5939\u4e0b\uff0c\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},".\n\u251c\u2500\u2500 STM32F103rf_ecdsa.pkg       /* STM32F103 ecdsa PowerWriter\xae \u5de5\u7a0b */\n\u251c\u2500\u2500 STM32F103rf_matrix.pkg      /* STM32F103 ecdsa PowerWriter\xae matirx\u5de5\u7a0b */\n\u251c\u2500\u2500 ecdsa\n\u2502\xa0\xa0 \u251c\u2500\u2500 SafeLic_53ECCC98.uprj       /* ICWKEY ECDSA \u5de5\u7a0b\u9879\u76ee */\n\u2502\xa0\xa0 \u251c\u2500\u2500 cortex_chipid_binding.c     /* ICWKEY ECDSA \u5de5\u7a0b\u6e90\u7801 */\n\u2502\xa0\xa0 \u2514\u2500\u2500 cortex_chipid_binding.h     /* ICWKEY ECDSA \u5de5\u7a0b\u6e90\u7801 */\n\u251c\u2500\u2500 matrix                      /* PowerWriter\xae Matrix \u5de5\u7a0b\u6e90\u7801 */\n\u2502\xa0\xa0 \u251c\u2500\u2500 DebugConfig\n\u2502\xa0\xa0 \u251c\u2500\u2500 Listings\n\u2502\xa0\xa0 \u251c\u2500\u2500 Objects\n\u2502\xa0\xa0 \u251c\u2500\u2500 UidSample.uvguix.CSHSOFT\n\u2502\xa0\xa0 \u251c\u2500\u2500 UidSample.uvoptx\n\u2502\xa0\xa0 \u251c\u2500\u2500 UidSample.uvprojx\n\u2502\xa0\xa0 \u251c\u2500\u2500 cortex_chipid_binding.c\n\u2502\xa0\xa0 \u251c\u2500\u2500 cortex_chipid_binding.h\n\u2502\xa0\xa0 \u251c\u2500\u2500 main.c\n\u2502\xa0\xa0 \u2514\u2500\u2500 startup_stm32f10x_hd.s\n\u2514\u2500\u2500 password.txt\n")),(0,r.kt)("h3",{id:"flash_verify"},"5.5.4.4\uff1a\u56fa\u4ef6\u6821\u9a8c"),(0,r.kt)("p",null,"\u56fa\u4ef6\u6821\u9a8c\u529f\u80fd\u4e3a\u52a0\u5bc6\u5e93\u6700\u6838\u5fc3\u7684\u529f\u80fd\uff0c\u901a\u8fc7\u56fa\u4ef6\u6821\u9a8c\u6a21\u5757\uff0c\u53ef\u68c0\u6d4b\u5230\u5f53\u524d\u56fa\u4ef6\u662f\u5426\u88ab\u7be1\u6539\uff0c\u5e76\u5bf9\u4fee\u6539\u505a\u51fa\u54cd\u5e94\uff0c\u4ece\u800c\u907f\u514d\u6838\u5fc3\u529f\u80fd\u88ab\u7834\u89e3\uff0c\u4fdd\u62a4\u7528\u6237\u56fa\u4ef6\uff0c\u56fa\u4ef6\u6821\u9a8c\u7b97\u6cd5\uff0c\u53ea\u4f1a\u6821\u9a8c\u5f53\u524d\u5de5\u7a0b\u7f16\u8bd1\u7684\u56fa\u4ef6\u7684\u8303\u56f4\uff0c\u4e0d\u4f1a\u6821\u9a8c\u56fa\u4ef6\u8303\u56f4\u4e4b\u5916\u7684\u6570\u636e\uff0c\u5e76\u4e14\uff0c\u9488\u5bf9\u5f53\u524d\u56fa\u4ef6\u5185\u7684\u52a8\u6001\u6570\u636e\u8303\u56f4\uff0c\u53ef\u7075\u6d3b\u8bbe\u7f6e\u8df3\u8fc7\u5730\u5740\u548c\u5927\u5c0f\uff0c\u914d\u7f6e\u8df3\u8fc7\u6821\u9a8c\u7684\u5730\u5740\u548c\u53c2\u8003\u5982\u4e0b\u914d\u7f6e\uff1a"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"}
1,"\u5b9a\u4e49\u52a8\u6001\u6570\u636e\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="advance_software_protect_samples.c"',title:'"advance_software_protect_samples.c"'},'/* \u5728Flash \u4e2d\u5b9a\u4e49 SN \u52a8\u6001\u6570\u636e \uff0c\u5f53\u524d\u5b9a\u4e49\u4e3a0x08001000 */\n#ifdef ADVANCE_SOFTWARE_PROTECT_SN_ENABLE\n#ifdef ADVANCE_SOFTWARE_PROTECT_COMPILER_GCC\n#define ADVANCE_SOFTWARE_PROTECT_SN_ADDR ".advance_software_protect_sn" /*defined in ld link Script */\n#elif defined(ADVANCE_SOFTWARE_PROTECT_COMPILER_IAR)\n#define ADVANCE_SOFTWARE_PROTECT_SN_ADDR 0x08001000\n#else\n#define ADVANCE_SOFTWARE_PROTECT_SN_ADDR ".ARM.__at_0x08001000"\n#endif\n#ifdef ADVANCE_SOFTWARE_PROTECT_COMPILER_IAR\n#pragma diag_suppress = Pa082\nconst uint32_t m_serialnumber @ADVANCE_SOFTWARE_PROTECT_SN_ADDR = {0}; /* Fixed address for easy maintenance */\n#else\nconst uint32_t m_serialnumber __attribute__((section(ADVANCE_SOFTWARE_PROTECT_SN_ADDR))) = {0}; /* Fixed address for easy maintenance */\n#endif\n#endif\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u8df3\u8fc7\u6821\u9a8c\u533a\u57df\u914d\u7f6e\u65b9\u6cd5")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_porting.c"',title:'"lib/advance_software_protect_porting.c"'},"S_ADV_SOFTWARE_PROTECT_FLASH_VERIFY_START\n/* Please add the dynamic storage area you want to skip, refer to the sequence\n * number definition below and add the definition after it.\n */\n/***************************** START *********************************/\n    /* \u8df3\u8fc7 SN \u6821\u9a8c */\n#ifdef ADVANCE_SOFTWARE_PROTECT_SN_ENABLE\n    {\n        .m_skip_addr = (void *)&m_serialnumber,\n        .m_skip_size = sizeof(m_serialnumber)\n    },\n#endif\n    /* \u5982\u679c\u9700\u8981\u8df3\u8fc7\u5176\u4ed6\u6821\u9a8c\u533a\u57df\uff0c\u8bf7\u53c2\u8003SN \u7684\u8df3\u8fc7\u65b9\u6cd5\uff0c\u5728\u4e0b\u9762\u8fdb\u884c\u5b9a\u4e49\u5373\u53ef */\n    /* ... */\n    /****************************** END **********************************/\nS_ADV_SOFTWARE_PROTECT_FLASH_VERIFY_END S_ADV_SOFTWARE_PROTECT_FLASH_VERIFY_APP\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u8c03\u7528\u65b9\u6cd5\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'/* for flash verify */\n#ifdef ADVANCE_SOFTWARE_PROTECT_FLASH_VERIFY_ENABLE\nvoid advance_software_protect_flash_verify_sample()\n{\n    advance_software_protect_logger(ADV_DEBUG, " ---------------Flash Verify start----------\\r\\n");\n    E_ADV_SOFTWARE_PROTECT_FLASH_VERIFY_RESULT result = advance_software_protect_flash_verify(ADV_DATA_ENCRYPT_KEY);\n\n    switch (result)\n    {\n    case ConfigError: /* configure error ! */\n        advance_software_protect_logger(ADV_DEBUG, " \u914d\u7f6e\u9519\u8bef !\\r\\n");\n        break;\n\n    case UnprocessedAfterComplied: /* Run in Debug mode */\n        advance_software_protect_logger(ADV_DEBUG, " (\u5f53\u524d\u4e3a\u8c03\u8bd5\u6a21\u5f0f) \u56fa\u4ef6\u6ca1\u6709\u5904\u7406\uff0c\u529f\u80fd\u672a\u751f\u6548...\\r\\n");\n        break;\n\n    case FlashVerifyFailed: /* Verify Failed */\n        advance_software_protect_logger(ADV_DEBUG, " \u6821\u9a8c\u5931\u8d25 !!!\\r\\n");\n        break;\n\n    case FlashVerifyPassed: /* Verify Passed */\n        advance_software_protect_logger(ADV_DEBUG, " \u6821\u9a8c\u6210\u529f...\\r\\n");\n        break;\n    }\n\n    advance_software_protect_logger(ADV_DEBUG, " ---------------Flash Verify end----------\\r\\n");\n}\n#endif\n\nASP_ENCRYPT_F_DECL(void advance_software_protect_sample())\nvoid advance_software_protect_sample()\n{\n    /* flash verify */\n#ifdef ADVANCE_SOFTWARE_PROTECT_FLASH_VERIFY_ENABLE\n    advance_software_protect_flash_verify_sample();\n#endif\n}\n\n')),(0,r.kt)("h3",{id:"code_encryption"},"5.5.4.5\uff1a\u51fd\u6570\u52a0\u5bc6"),(0,r.kt)("p",null,"\u51fd\u6570\u52a0\u5bc6\u4e3a\u52a0\u5bc6\u5e93\u6700\u6838\u5fc3\u7684\u529f\u80fd\u4e4b\u4e00\uff0c\u901a\u8fc7\u51fd\u6570\u52a0\u5bc6\uff0c\u5c06\u4f1a\u5c06\u90e8\u5206\u51fd\u6570\u5728\u82af\u7247\u4e2d\uff0c\u8fdb\u884c\u52a0\u5bc6\u5b58\u50a8\uff0c\u7136\u540e\u901a\u8fc7\uff0c\u52a0\u5bc6\u51fd\u6570loader \u8fdb\u884c\u52a0\u8f7d\uff0c\u518d\u8fdb\u884c\u8c03\u7528\uff0c\u53ef\u786e\u4fdd\u6838\u5fc3\u4ee3\u7801\u4e0d\u4f1a\u88ab\u53cd\u7f16\u8bd1\uff0c\u4ece\u800c\u4fdd\u62a4\u56fa\u4ef6\u7684\u5b89\u5168\uff0c\u58f0\u660e\u52a0\u5bc6\u51fd\u6570\u7684\u65b9\u6cd5\u5982\u4e0b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"// \u518d\u51fd\u6570\u5b9a\u4e49\u5904\u7684\u524d\u9762\uff0c\u589e\u52a0\u5982\u4e0b\u58f0\u660e\uff0c\u5373\u53ef\u58f0\u660e\u4e3a\u52a0\u5bc6\u51fd\u6570\u3002\nASP_ENCRYPT_F_DECL(\u51fd\u6570\u539f\u578b)\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"\u52a0\u5bc6\u5e93\u7684\u6838\u5fc3\u4ee3\u7801\u5747\u5df2\u58f0\u660e\u4e3a\u52a0\u5bc6\u51fd\u6570\uff0c\u5f53\u524d advance_softw
1are_protect_porting.c \u4e2d\u7684\u6240\u6709\u51fd\u6570\uff0c\u5747\u4e3a\u52a0\u5bc6\u51fd\u6570\u3002"),(0,r.kt)("li",{parentName:"ul"},"\u7528\u6237\u53ef\u901a\u8fc7\u6b64\u58f0\u660e\uff0c\u5c06\u51fd\u6570\u5b9a\u4e49\u4e3a\u52a0\u5bc6\u51fd\u6570\u3002"))),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"advance_software_protect_signature\u3001advance_software_protect_flash_verify\u3001advance_software_protect_anti_debugger \u7b49\u6838\u5fc3\u51fd\u6570\u8c03\u7528\u7684\u7236\u51fd\u6570\uff0c\u63a8\u4ecb\u8bbe\u7f6e\u4e3a\u52a0\u5bc6\u51fd\u6570\u3002")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u52a0\u5bc6\u51fd\u6570\u5728\u8c03\u7528\u524d\uff0c\u5fc5\u987b\u901a\u8fc7 Loader \u8fdb\u884c\u52a0\u8f7d\uff0c\u5426\u5219\u5c06\u5bfc\u81f4\u6307\u4ee4\u603b\u7ebf\u786c\u4ef6\u5f02\u5e38\uff0c\u8be6\u89c1 ",(0,r.kt)("a",{parentName:"p",href:"#config_encrtypt_code"},"\u52a0\u5bc6\u51fd\u6570 loader"),"\u3002"),(0,r.kt)("p",{parentName:"admonition"},"\u6b64\u5916\uff0c\u52a0\u5bc6\u51fd\u6570\u7684\u5b58\u50a8\u7a7a\u95f4\u6839\u636e\u5de5\u7a0b\u8d44\u6e90\u5206\u914d\u7684  ",(0,r.kt)("inlineCode",{parentName:"p"},".advance_software_protect_encryption_section")," \u6bb5\u8fdb\u884c\u5b58\u50a8\uff0c\u5982\u679c\u52a0\u5bc6\u51fd\u6570\u8fc7\u591a\u7684\u5bfc\u81f4\u7f16\u8bd1\u51fa\u9519\u65f6\uff0c\u9002\u5f53\u8c03\u6574\u8d44\u6e90\u914d\u7f6e\u3002")),(0,r.kt)("h3",{id:"anti_debugger"},"5.5.4.6\uff1a\u53cd\u8c03\u8bd5\u670d\u52a1"),(0,r.kt)("p",null,"\u4e3a\u4e86\u8f85\u52a9\u9879\u76ee\u5f00\u53d1\u5bf9\u9879\u76ee\u8fdb\u884c\u8f85\u52a9\u52a0\u5bc6\uff0c\u52a0\u5bc6\u5e93\u540c\u65f6\u63d0\u4f9b\u4e86\u6807\u51c6\u7684\u6d41\u7a0b\uff0c\u7528\u4e8e\u5e2e\u52a9\u5f00\u53d1\u8005\uff0c\u5b8c\u6210\u56fa\u4ef6\u7684\u57fa\u7840\u53cd\u8c03\u8bd5\u529f\u80fd\uff0c\u76f8\u5bf9\u4e8e\u4f20\u7edf\u7684\u5f00\u53d1\u6a21\u5f0f\uff0c\u53cd\u8c03\u8bd5\u670d\u52a1\uff0c\u5728\u5bf9\u9879\u76ee\u5f00\u53d1\u8f85\u52a9\u65f6\u66f4\u52a0\u4fbf\u6377\u3002"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u914d\u7f6e\u65b9\u6cd5\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_porting.c"',title:'"lib/advance_software_protect_porting.c"'},"/* for anti debugger*/\n#ifdef ADVANCE_SOFTWARE_PROTECT_ANTI_DEBUGGER_ENABLE\n/*\n * @brief   Disabling the debugger\n * @pram      none\n * @retval  none\n */\nASP_ENCRYPT_F_DECL(void advance_software_protect_debugger_disable())\nvoid advance_software_protect_debugger_disable()\n{\n#ifdef RELEASE\n    /* dsiable debugger */\n    __HAL_AFIO_REMAP_SWJ_DISABLE();\n#endif\n}\n/*\n * @brief   Check whether read protection is enabled\n * @pram      none\n * @retval  true is enable rdp\n */\nASP_ENCRYPT_F_DECL(bool advance_software_protect_rdp_check())\nbool advance_software_protect_rdp_check()\n{\n#ifdef RELEASE\n    /*check RDP */\n    FLASH_OBProgramInitTypeDef m_cur_ob;\n    HAL_FLASHEx_OBGetConfig(&m_cur_ob);\n    return (m_cur_ob.RDPLevel != OB_RDP_LEVEL_0);\n#else\n    return true; /* default return true */\n#endif\n}\n/*\n * @brief   Disabling Read Protection\n * @pram      none\n * @retval  none\n */\nASP_ENCRYPT_F_DECL(void advance_software_protect_rdp_enable())\nvoid advance_software_protect_rdp_enable()\n{\n#ifdef RELEASE\n    bool rdp_result = {0};\n    /* get current ob */\n    FLASH_OBProgramInitTypeDef m_cur_ob;\n    HAL_FLASHEx_OBGetConfig(&m_cur_ob);\n\n    /* unlock ob */\n    if (HAL_FLASH_Unlock() == HAL_OK && HAL_FLASH_OB_Unlock() == HAL_OK)\n    {\n\n        /* Set RDP to Level 1 or Level 2*/\n        m_cur_ob.RDPLevel = OB_RDP_LEVEL_1;\n\n        /* update ob */\n        rdp_result = (HAL_FLASHEx_OBProgram(&m_cur_ob) == HAL_OK);\n\n        /* lock flash */\n        HAL_FLASH_OB_Lock();\n        HAL_FLASH_Lock();\n\n        /*\n            To make the option byte take effect, note that by resetting the target chip,\n            the target chip reloads the option byte to make it take effect\n        */\n        if (rdp_result)\n        {\n            HAL_FLASH_OB_
1Launch();\n        }\n    }\n#endif\n}\n#endif\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u4e3a\u4e86\u52a0\u5f3a\u4ee3\u7801\u7684\u5b89\u5168\u6027\uff0c\u6838\u5fc3\u51fd\u6570\u5fc5\u987b\u518d\u6b21 \u4f7f\u7528  ASP_ENCRYPT_F_DECL \u58f0\u660e\uff0c\u8fdb\u884c\u52a0\u5bc6\uff0c\u6b64\u5916\uff0c\u5f53\u524d\u63a5\u53e3\u5fc5\u987b\u6839\u636e\u5b9e\u9645\u82af\u7247\u8fdb\u884c\u5b9e\u73b0\u3002")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u5728\u5f00\u53d1\u8c03\u8bd5\u9636\u6bb5\uff0c\u4f7f\u7528\u65e0 RELEASE \u5b9a\u4e49\u7684\u5b8f\u8fdb\u884c\u8c03\u8bd5\uff0c\u5728\u6700\u540e\u53d1\u5e03\u9636\u6bb5\uff0c\u5728\u5207\u6362\u5230Release \u6a21\u5f0f\u8fdb\u884c\u53d1\u5e03\u7f16\u8bd1\uff0c\u8be6\u89c1 ",(0,r.kt)("a",{parentName:"p",href:"#mdk_step6"},"\u5176\u4ed6\u8bbe\u7f6e"),"\u3002 ")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u8c03\u7528\u65b9\u6cd5\uff1a")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_samples.c"',title:'"lib/advance_software_protect_samples.c"'},'\nbool advance_software_protect_anti_debugger_sample(E_AntiDebuggerEvent event)\n{\n    switch (event)\n    {\n    /* Development mode running */\n    case Development:\n        advance_software_protect_logger(ADV_DEBUG, " (Running in development mode) Anti Debugger ...\\r\\n");\n        return true;\n\n    /* The RDP mode is disabled */\n    case RDPDisabled:\n        advance_software_protect_logger(ADV_DEBUG, " (Read protection is not enabled) Anti Debugger ...\\r\\n");\n        return true; /* Return true if you want to enable RDP */\n\n    /* The RDP mode is enabled  */\n    case RDPEnabled:\n        advance_software_protect_logger(ADV_DEBUG, " (Read protection enabled) Anti Debugger ...\\r\\n");\n        return true; /* Return true if you want to reset */\n\n    /* The system is resetting  */\n    case SystemReset:\n        advance_software_protect_logger(ADV_DEBUG, " (Request system reset) Anti Debugger ...\\r\\n");\n        return true; /* Return true if you want to reset */\n\n    /* Disable Debugger */\n    case DebuggerDisable:\n        advance_software_protect_logger(ADV_DEBUG, " (Disabling the debugger) Anti Debugger ...\\r\\n");\n        return true; /* Return true if you want to disable the debugger */\n    }\n    return true;\n}\n\nASP_ENCRYPT_F_DECL(void advance_software_protect_sample())\nvoid advance_software_protect_sample()\n{\n#ifdef ADVANCE_SOFTWARE_PROTECT_ANTI_DEBUGGER_ENABLE\n    /* anti debugger */\n    advance_software_protect_anti_debugger(advance_software_protect_anti_debugger_sample);\n#endif\n}\n')),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u8c03\u7528 advance_software_protect_anti_debugger \u7684\u7236\u51fd\u6570\uff0c\u518d\u6b21\u4f7f\u7528 ASP_ENCRYPT_F_DECL \u8fdb\u884c\u52a0\u5bc6\u51fd\u6570\u58f0\u660e\uff0c\u53ef\u4ee5\u8fdb\u4e00\u6b65\u589e\u5f3a\u5b89\u5168\u6027\u3002")),(0,r.kt)("h3",{id:"data_encryption"},"5.5.4.7\uff1a\u6570\u636e\u52a0\u5bc6"),(0,r.kt)("p",null,"\u52a0\u5bc6\u5e93\u5185\u7f6e\u4e86\u79c1\u6709\u6570\u636e\u52a0\u5bc6\u7b97\u6cd5\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u8bf7\u786e\u4fdd\u6e90\u7801\u914d\u7f6e \u548c \u547d\u4ee4\u884c\u53c2\u6570  ",(0,r.kt)("inlineCode",{parentName:"p"},"-k"),"  \u4fdd\u6301\u4e00\u81f4\uff0c\u6e90\u7801\u4e2d\u7684\u914d\u7f6e\u4f4d\u7f6e\u4e3a\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="lib/advance_software_protect_user.h"',title:'"lib/advance_software_protect_user.h"'},"/* key for data encrypt */\n#if (defined ADVANCE_SOFTWARE_PROTECT_FLASH_VERIFY_ENABLE) || (defined ADVANCE_SOFTWARE_PROTECT_CODE_ENCRYPT_ENABLE)\n#define ADV_DATA_ENCRYPT_KEY (0xfb90ffcb9b62c2e6) /* 64 bit*/\n#endif\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u6bcf\u4e00\u4e2a\u9879\u76ee\u90fd\u5e94\u8be5\u8bbe\u7f6e\u4e0d\u540c\u7684\u5bc6\u7801\uff0c\u5e76\u4e14\u548c\u547d\u4ee4\u884c\u53c2\u6570 ",(0,r.kt)("inlineCode",{parentName:"p"},"-k")," \u4fdd\u6301\u4e00\u81f4\u3002")),(0,r.kt)("h3",{id:"status"},"5.5.4.8\uff1a\u8fd0\u884c\u72b6\u6001\u76d1\u63a7"),(0,r.kt)("p",null,"\u5982\u679c\u52a0\u5bc6\u5e93\u76f8\u5173\u6838\u5fc3\u529f\u80fd\uff0c\u88ab\u9006\u5411\u7834\u89e3\uff0c\u53bb\u9664\uff0c\u901a\u8fc7\u83b7\u53d6\u52a0\u5bc6\u5e93\u7684\u8fd0\u884c\u72b6\u6001\u63a5\u53e3\uff0c\u8bfb\u53d6\u7cfb\u7edf\u72b6\u6001\uff0c\u6839\u636e\u72b6\u6001\uff0c\u6267\u884c\u76f8\u5bf9\u5e94\u7684\u52a8\u4f5c\uff0c\u8fdb\u4e00\u6b65\u589e\u52a0\u56fa\u4ef6\u7684\u5b89\u5168\u6027\uff0c\u8fd4\u56de\u72b6\u6001\u53c2\u8003\u5982\u4e0b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c",metastring:'title="advance_softw
1are_protect_status"',title:'"advance_software_protect_status"'},"/* system executed status  */\ntypedef struct advance_software_protect_status\n{\n    /* Signature executed */\n    bool m_signature_executed;\n\n    /* Flash verify executed */\n    bool m_flash_verify_executed;\n\n    /* Anti debugger */\n    bool m_anti_debugger_executed;\n\n} advance_software_protect_status;\n")),(0,r.kt)("p",null,"\u5f53\u524ddemo\uff0c\u5728main \u51fd\u6570\u4e2d\u8fdb\u884c \u52a0\u5bc6\u5e93\u8fd0\u884c\u72b6\u6001\u68c0\u67e5\uff0c\u6839\u636e\u72b6\u6001\uff0c\u6253\u5370\u52a0\u5bc6\u5e93\u7684\u6267\u884c\u72b6\u6001\u4fe1\u606f\uff0c\u5982\u4e0b\u6240\u793a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'int main(void)\n{\n  while (1)\n  {\n        /* USER CODE END WHILE */\n        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);\n        HAL_Delay(500);\n        \n        /* \u83b7\u53d6\u52a0\u5bc6\u5e93\u7684\u53cd\u9988\u72b6\u6001 */\n        advance_software_protect_status status;\n        if(!advance_software_protect_system_status_get(&status)){\n            advance_software_protect_logger(ADV_ERROR," \u68c0\u6d4b\u5230\u6838\u5fc3\u4ee3\u7801\uff0c\u88ab\u52a8\u6001\u4fee\u6539 !!! \\r\\n");\n        }\n        if(!status.m_signature_executed){\n            advance_software_protect_logger(ADV_ERROR,"\u7b7e\u540d\u670d\u52a1\u88ab\u975e\u6cd5\u53bb\u9664\uff0c\u6216\u8005\u7be1\u6539 !!! \\r\\n");\n        }\n        if(!status.m_flash_verify_executed){\n            advance_software_protect_logger(ADV_ERROR,"\u56fa\u4ef6\u6821\u9a8c\u529f\u80fd\u88ab\u975e\u6cd5\u4fee\u6539 !!! \\r\\n");\n        }\n        if(!status.m_signature_executed){\n            advance_software_protect_logger(ADV_ERROR,"\u53cd\u8c03\u8bd5\u670d\u52a1\u6846\u67b6\u88ab\u975e\u6cd5\u53bb\u9664 !!! \\r\\n");\n        }\n        \n        /* USER CODE BEGIN 3 */\n  }\n  /* USER CODE END 3 */\n}\n')),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"\u7cfb\u7edf\u72b6\u6001\u76d1\u63a7\u670d\u52a1\uff0c\u5c5e\u4e8e\u52a0\u5bc6\u5e93\u6700\u5e95\u5c42\u5185\u6838\uff0c\u4e14\u672c\u8eab\u5373\u4e3a\u52a0\u5bc6\u51fd\u6570\uff0c\u65e0\u6cd5\u901a\u8fc7\u9759\u6001\u53cd\u7f16\u8bd1\u7684\u65b9\u6cd5\u8fdb\u884c\u53bb\u9664\uff0c\u7531\u4e8e\u6570\u636e\u672c\u8eab\u8fdb\u884c\u591a\u6b21\u7b7e\u540d\uff0c\u7406\u8bba\u4e0a\u4e5f\u65e0\u6cd5\u901a\u8fc7\u52a8\u6001\u5185\u5b58\u8865\u4e01\u7684\u65b9\u5f0f\uff0c\u76f4\u63a5\u4fee\u6539\u7cfb\u7edf\u72b6\u6001\u3002")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u7cfb\u7edf\u72b6\u6001\u7684\u68c0\u67e5\uff0c\u53ef\u4ee5\u5728\u56fa\u4ef6\u4e2d\u591a\u5904\u8fdb\u884c\u57cb\u70b9\uff0c\u5f53\u68c0\u6d4b\u5230\u5f02\u5e38\u65f6\uff0c\u518d\u8fdb\u884c\u5bf9\u5e94\u7684\u54cd\u5e94\uff0c\u8fd9\u662f\u6574\u4e2a\u52a0\u5bc6\u5e93\u6700\u540e\u4e00\u9053\u9632\u7ebf\uff0c\u7528\u4e8e\u68c0\u6d4b\u52a0\u5bc6\u5e93\u672c\u8eab\u88ab\u975e\u6cd5\u79fb\u9664\u6216\u8005\u4fee\u6539\u3002")),(0,r.kt)("h3",{id:"other"},"5.5.4.9\uff1a\u5176\u4ed6"),(0,r.kt)("p",null,"\u9664\u4e4b\u524d\u63d0\u4f9b\u7684\u6838\u5fc3\u529f\u80fd\u4e4b\u5916\uff0c\u6b64\u5916\u63d0\u4f9b\u4e86\u4e00\u4e9b\u8f85\u52a9\u529f\u80fd\uff0c\u65b9\u4fbf\u8fdb\u884c\u9879\u76ee\u5f00\u53d1\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"    /* \u8bfb\u53d6\u52a0\u5bc6\u5e93\u7684\u7248\u672c */\n    extern const char *advance_software_protect_version(void);\n    /* dump \u6570\u636e\uff0c\u7528\u4e8e\u5206\u6790 */\n    extern void advance_software_protect_dump_buf(const char *title, unsigned char *buf, size_t len);\n    /* \u968f\u673a\u51fd\u6570 */\n    extern int advance_software_protect_random(unsigned char *buf, size_t len);\n    /* \u8bbe\u7f6e\u6700\u540e\u4e00\u6b21\u9519\u8bef\u7801\uff0c\u53ef\u5229\u7528\u6b64\u63a5\u53e3\u6e05\u695a\u52a0\u5bc6\u5e93\u9519\u8bef\u7801\u4fe1\u606f  */\n    extern void advance_software_protect_set_last_error(E_ADV_SOFTWARE_PROTECT_ERROR_CODE err);\n    /* \u5f53\u9047\u5230\u5931\u8d25\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u6b64\u63a5\u53e3\u8bfb\u53d6\u9519\u8bef\u7801\u4fe1\u606f\uff0c\u65b9\u4fbf\u8fdb\u884c\u9519\u8bef\u5206\u6790 */\n    extern E_ADV_SOFTWARE_PROTECT_ERROR_CODE advance_softw
1are_protect_get_last_error(void);\n    /* \u52a0\u5bc6\u5e93\u81ea\u5e26\u7684 hash \u51fd\u6570 */\n    extern uint32_t crc32_inner(const void *data, int nBytes);\n    extern uint32_t crc32_continue_inner(uint32_t prev_crc, const void *data, int nBytes);\n")),(0,r.kt)("h3",{id:"debugging"},"5.5.4.2\uff1a\u8c03\u8bd5\u4e0e\u53d1\u5e03"),(0,r.kt)("h4",{id:"debugging"},"5.5.4.2.1\uff1a\u5de5\u7a0b\u8c03\u8bd5\u65b9\u6cd5"),(0,r.kt)("p",null,"\u5f53\u6240\u6709\u7684\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5bf9\u5de5\u7a0b\u8fdb\u884c\u7f16\u8bd1\uff0c\u5c06\u4f1a\u770b\u5230IDE \u7684\u7f16\u8bd1\u8f93\u51fa\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"Rebuild started: Project: stm32f103rfc6\n*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\\Keil_v5\\ARM\\ARMCLANG5\\Bin'\nRebuild target 'stm32f103rfc6_release'\nassembling startup_stm32f103xg.s...\ncompiling stm32f1xx_hal_gpio_ex.c...\ncompiling stm32f1xx_hal.c...\ncompiling stm32f1xx_hal_gpio.c...\ncompiling main.c...\ncompiling stm32f1xx_hal_crc.c...\ncompiling stm32f1xx_hal_rcc_ex.c...\ncompiling stm32f1xx_it.c...\ncompiling stm32f1xx_hal_cortex.c...\ncompiling stm32f1xx_hal_msp.c...\ncompiling stm32f1xx_hal_dma.c...\ncompiling stm32f1xx_hal_rcc.c...\ncompiling system_stm32f1xx.c...\ncompiling stm32f1xx_hal_tim_ex.c...\ncompiling stm32f1xx_hal_tim.c...\ncompiling stm32f1xx_hal_pwr.c...\ncompiling advance_software_protect_porting.c...\ncompiling advance_software_protect_samples.c...\ncompiling stm32f1xx_hal_exti.c...\ncompiling stm32f1xx_hal_flash_ex.c...\ncompiling stm32f1xx_hal_uart.c...\ncompiling stm32f1xx_hal_flash.c...\nlinking...\nProgram Size: Code=42962 RO-data=5574 RW-data=180 ZI-data=9956  \nFromELF: creating hex file...\nAfter Build - User command #1: fromelf --bin -o \"E:\\MainProjects\\2021\\PowerWriter\xae_advance_software_protect\\PowerWriter\xae_advance_software_protect\\library\\project\\mdk_demo\\stm32f103rfc6\\MDK-ARM\\stm32f103rfc6\\stm32f103rfc6.bin\" \"E:\\MainProjects\\2021\\PowerWriter\xae_advance_software_protect\\PowerWriter\xae_advance_software_protect\\library\\project\\mdk_demo\\stm32f103rfc6\\MDK-ARM\\stm32f103rfc6\\stm32f103rfc6.axf\"\nAfter Build - User command #2: ../../../../tool/windows/advance_software_protect.exe  -s 0x08000000 -k 0xfb90ffcb9b62c2e6 -i ./stm32f103rfc6/stm32f103rfc6.bin/ER_IROM1 -r ./stm32f103rfc6/stm32f103rfc6.bin/ER_IROM2\n\f-----------------------------------------------------------------------------------------------------------------------\n                        Open source advance software protect library\n    This project provides a set of universal MCU software encryption algorithm.The goal is simple, easy to use,easy \nto integrate, and does not require any additional hardware,The following are the test cases of the project, please \nselect the appropriate use method, some functions need to be used together with this tool, if you have any questions,\nplease contact us,customer service email:[email protected].\nteam   : ICWorkshop HPT Dep Team\nauthor : cshsoft([email protected])\nwebsite: www.icworkshop.com \ntools  : www.PowerWriter\xae.cn(.com)\n-----------------------------------------------------------------------------------------------------------------------\n[advance software protect][debug]:  Environment:E:\\MainProjects\\2021\\PowerWriter\xae_advance_software_protect\\PowerWriter\xae_advance_software_protect\\library\\project\\mdk_demo\\stm32f103rfc6\\MDK-ARM\n[advance software protect][debug]:  Prepare encrypted firmware...\n[advance software protect][info ]:  Start address:  0x08000000\n[advance software protect][info ]:  End address:    0x0800b498\n[advance software protect][info ]:  Ram code size:  0x000009b4\n[advance software protect][debug]:  search flash verify ...\n[advance software protect][debug]:  flash verify enabled ...\n[advance software protect][info ]:  flash verify skip verify total [3]...\n[advance software protect][info ]:  flash verify skip item :    Address:0x0800A078  Size:0x24\n[advance softw
1are protect][info ]:  flash verify skip item :    Address:0x08002000  Size:0x8d\n[advance software protect][info ]:  flash verify skip item :    Address:0x08001000  Size:0x4\n[advance software protect][debug]:  anti debugger enabled ...\n[advance software protect][debug]:  search dynamic function encryption (ram code) ...\n[advance software protect][debug]:  dynamic function encryption enabled ...\n[advance software protect][info ]:  Ram code address:   0x00000000(dynamic in user code)\n[advance software protect][debug]:  search flash done ...\n[advance software protect][debug]:  ram code updating ...\n[advance software protect][debug]:  ram code update ok ...\n[advance software protect][debug]:  Process anti debugger check ok ...\n[advance software protect][debug]:  Process flash verify start ...\n[advance software protect][info ]:  hash block item :   Start:0x08000000    End:0x8001000   Size:0x1000 hash:0xa5a3e42e\n[advance software protect][info ]:  hash block item :   Start:0x08001004    End:0x8002000   Size:0xffc  hash:0x56320614\n[advance software protect][info ]:  hash block item :   Start:0x0800208d    End:0x800a078   Size:0x7feb hash:0x68c5f96b\n[advance software protect][info ]:  hash block item :   Start:0x0800a09c    End:0x800be4c   Size:0x1db0 hash:0x72d02bb6\n[advance software protect][debug]:  Process flash verify ok ...\n[advance software protect][debug]:  Save to file : ./stm32f103rfc6/stm32f103rfc6.bin/ER_IROM1_ER_IROM2_encrypted.bin ...\n[advance software protect][debug]:  All done ...\n\".\\stm32f103rfc6\\stm32f103rfc6.axf\" - 0 Error(s), 0 Warning(s).\nBuild Time Elapsed:  00:00:06\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u8bf7\u6ce8\u610f\uff0cIDE \u7f16\u8bd1\u662f\u5426\u62a5\u9519\uff0c\u5178\u578b\u7684\u9519\u8bef\uff0c\u6bd4\u5982\u7a7a\u95f4\u4e0d\u8db3\uff0c\u53ef\u9002\u5f53\u8c03\u6574\u8d44\u6e90\u914d\u7f6e\uff0c\u6216\u8005\u63d0\u793a\u6587\u4ef6\u5df2\u5b58\u5728\uff0c\u8bf7\u5220\u9664\u7f16\u8bd1\u8f93\u51fa\uff0c\u91cd\u65b0\u7f16\u8bd1\u9879\u76ee\u3002\u5e76\u7559\u610f\u6700\u7ec8\u7684\u8f93\u51fa\u6587\u4ef6\u8def\u5f84\u3002")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u4f7f\u7528PowerWriter\xae \u8fdb\u884c\u56fa\u4ef6\u7684\u70e7\u5f55"),"\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250111102505833",src:n(93844).Z,width:"1396",height:"709"})),(0,r.kt)("p",null,"\u70e7\u5f55\u5b8c\u6210\u540e\uff0c\u53c2\u8003 ",(0,r.kt)("a",{parentName:"p",href:"#mdk_step6"},"\u5176\u4ed6\u8bbe\u7f6e")," \u914d\u7f6e\u65b9\u6cd5\uff0c\u4f7f\u7528MDK \u8fdb\u884c\u8c03\u8bd5\uff0c\u5e76\u5f00\u542f\u4e32\u53e3\u52a9\u624b\uff0c\u6211\u4eec\u5c06\u4ece\u4e32\u53e3\u8f93\u51fa\u4e2d\u770b\u5230\u5982\u4e0b\u4fe1\u606f\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250111102824593",src:n(83619).Z,width:"1131",height:"730"})),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"---------------------------------------------------------------------------------\n        Advance software protect lib\n \n This project provides a set of universal MCU software encryption algorithm.\n The goal is simple, easy to use, easy to integrate, and does not require any\n additional hardwareThe following are the test cases of the project, please \n select the appropriate use method, some functions need to be used together\n with repack tool, if you have any questions, please contact us\n \n \n PowerWriter\xae team\n Version:V1.0.0.0 Jan  9 2025 14:37:54\n Author: [email protected](cshsoft)\n Site: www.PowerWriter\xae.com\n Docs: https://docs.PowerWriter\xae.com/docs/next/PowerWriter\xae_for_arm/application_note/advance_software_protect\n ---------------------------------------------------------------------------------\n[D]: (Successful) Dynamic function encryption ...\n[I]:---------------Product Serial Number Info Start----------\n[I]: Product Serial number is : 0x123456AE , In Flash Address 0x08001000.\n[I]:---------------Product Serial Number Info End----------\n[D]: ---------------Single Object Watcher Simple Start ----------\n[D]: m_Object check passed at first time\n[E]: m_Object will fail if it is modified without updating the checksum value!\n[D]: m_Object had modified & updated, will be passed !\n[D]: ---------------Single Object Watcher Simple End----------\n[D]: ---------- Dynamic Muti-Object Watcher Simple Start ----------\n[D]: Set ObjectWatcher Event callback...\n[W]: [0x2
1000014C] Object already exist!\n[W]: Error param ...\n[I]: Alloc 100 dynamic object done ..\n[I]: m_aType exist..\n[D]: Total 126 objects in watching..\n[D]: m_class check passed ..\n[E]: [0x2000014C] Object was modified!\n[D]: Passed: 125, Total : 126 ..\n[D]: m_class update ok ..\n[I]: m_bType removed, left 125 object in watching..\n[I]: All objects updated...\n[I]: All objects removed, left 0 object in watching..\n[D]: ---------------Dynamic Muti-Object Watcher Simple End----------\n[D]: ---------------Product Signature start----------\n[D]: Chip signature verify passed...\n[D]: ---------------Product Signature end----------\n[D]: ---------------Flash Verify start----------\n[D]: Flash Verify passed...\n[D]: ---------------Flash Verify end----------\n[D]: (Read protection enabled) Anti Debugger ...\n[D]: (Disabling the debugger) Anti Debugger ...\n\n")),(0,r.kt)("h4",{id:"publish"},"5.5.4.2.2\uff1a\u53d1\u5e03"),(0,r.kt)("p",null,"\u5f53\u5de5\u7a0b\u6240\u6709\u7684\u9a8c\u8bc1\u5747\u5b8c\u6210\u4e4b\u540e\uff0c\u5c06\u5de5\u7a0b\u5207\u6362\u5230\u53d1\u5e03\u6a21\u5f0f\uff08\u542b RELEASE \u5b8f\u5b9a\u4e49\uff0c\u7528\u4e8e\u5f00\u542f\u53cd\u8c03\u8bd5\u7684\u90e8\u5206\u529f\u80fd\uff09\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250111101913522",src:n(92112).Z,width:"183",height:"71"})),(0,r.kt)("p",null,"\u5bf9\u9879\u76ee\u91cd\u65b0\u7f16\u8bd1\uff0c\u53c2\u8003\u8c03\u8bd5\u7684\u65b9\u6cd5\uff0c\u91cd\u65b0\u6dfb\u52a0RELEASE \u7684\u56fa\u4ef6\u5230PowerWriter\xae \u5de5\u7a0b\uff0c\u8fdb\u884c\u6700\u7ec8\u7684\u53d1\u5e03\u9a8c\u8bc1\uff0c\u8fdb\u884c\u751f\u4ea7\u3002"),(0,r.kt)("h2",{id:"cli"},"5.5.5\uff1a\u547d\u4ee4\u884c"),(0,r.kt)("p",null,"\u672c\u52a0\u5bc6\u5e93\u652f\u6301\u4e3b\u6d41\u7684 \u7f16\u8bd1\u5668\u73af\u5883\uff0c\u540c\u65f6\u4e5f\u652f\u6301\uff0c\u4e0d\u540c\u7684\u7cfb\u7edf\u5f00\u53d1\u5e73\u53f0\uff0c\u5728\u52a0\u5bc6\u5e93\u538b\u7f29\u5305\u7684 tool \u76ee\u5f55\u4e2d\uff0c\u53ef\u83b7\u53d6\u5bf9\u5e94\u5e73\u53f0\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"GIF 2025-1-10 15-05-25",src:n(41258).Z,width:"640",height:"235"})),(0,r.kt)("p",null,"\u5f53\u5728\u63a7\u5236\u53f0\u6267\u884c\u8fd0\u884c\u547d\u4ee4\u65f6\uff0c\u53ef\u770b\u5230\u5982\u4e0b\u7684\u5e2e\u52a9\u4fe1\u606f\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"-----------------------------------------------------------------------------------------------------------------------\n                                                Open source advance software protect library\n\n        This project provides a set of universal MCU software encryption algorithm.The goal is simple, easy to use,easy\nto integrate, and does not require any additional hardware,The following are the test cases of the project, please\nselect the appropriate use method, some functions need to be used together with this tool, if you have any questions,\nplease contact us,customer service email:[email protected].\n\n\nteam   : ICWorkshop HPT Dep Team\nauthor : cshsoft([email protected])\nwebsite: www.icworkshop.com\ntools  : www.PowerWriter\xae.cn(.com)\n-----------------------------------------------------------------------------------------------------------------------\n\nusage:\n        advance_software_protect {options} -i origin_firmware_path [-o encode_firmware_path]\n\n        options:\n                [-s 0xxxxxxxxx]         Specifies the start address of the firmware. If the Flash verification function\n                                        is enabled for the firmware, the parameters in the firmware will be updated. If\n                                        the Flash verification function is not enabled or the parameter is manually spe-\n                                        cified, the default value is 0x08000000.\n                [-l [0,1,2]]            Specify the log output level(The default is Level 2):\n                                        Level 0: only error information is displayed\n                                        Level 1: only debug information is displayed\n                                        Level 2: displays all information, including processing infomation\n\n        -i origin_firmware_path         Specifies the compiled origin firmware path,Currently, only bin files are\n                                        supported, *.afx or intel hex format firmware may be supported in the future.\n\n        [-r ramcode_path]               Specify the ram code path to encrypt,The default supported executables are\n                                        binary files, ER_IROM2 is probably the default name for MDK compilation\n\n        [-o encrypted_firmware_path]    Specifies the Release firmware path,The bin file is currently output directly,\n                                        If the output path is not specified, origin_firmware_path (*_encrypted.bin) is\n                                        saved by default.\n\n        -k 0xxxxxxxxxxxxxxxxx           Specifies the password for encrypting data,64bit.\n\n        -g [true|false]                 Generate encryption matrix.true allows repetition, false does not\nexample:\n        advance_softw
1are_protect -s 0x08000000 -i ./stm32f103rfc6.bin\n        advance_software_protect -l 0 -i ./stm32f103rfc6.bin\n        advance_software_protect -i ./stm32f103rfc6.bin -o ./stm32f103rfc6_encrypted.bin\n\nnotes:\n        Curly braces{} indicate a group of options, and curly braces[] indicate optional options.If you do not enter this parameter, default parameters will be used instead, and all other parameters are mandatory.\n")),(0,r.kt)("h3",{id:"cli_param"},"5.5.5.1\uff1a\u53c2\u6570\u8be6\u89e3"),(0,r.kt)("p",null,"\u7528\u6cd5:\nadvance_software_protect {options} -i origin_firmware_path ","[-o encode_firmware_path]"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"    \u9009\u9879:\n            [-s 0xxxxxxxxx]         \u6307\u5b9a\u56fa\u4ef6\u7684\u8d77\u59cb\u5730\u5740\u3002\u5982\u679c\u56fa\u4ef6\u7684\u95ea\u5b58\u9a8c\u8bc1\u529f\u80fd\n                                    \u5c06\u66f4\u65b0\u56fa\u4ef6\u4e2d\u7684\u53c2\u6570\u3002\u5982\u679c\n                                    \u95ea\u5b58\u9a8c\u8bc1\u529f\u80fd\u672a\u542f\u7528\u6216\u8be5\u53c2\u6570\u4e3a\u624b\u52a8\u6307\u5b9a\uff0c\u5219\u9ed8\u8ba4\u503c\u4e3a 0x08000000\u3002\n                                    \u9ed8\u8ba4\u503c\u4e3a 0x08000000\u3002\n            [-l [0,1,2]]            \u6307\u5b9a\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\uff08\u9ed8\u8ba4\u4e3a 2 \u7ea7\uff09\uff1a\n                                    0 \u7ea7\uff1a\u53ea\u663e\u793a\u9519\u8bef\u4fe1\u606f\n                                    1 \u7ea7\uff1a\u53ea\u663e\u793a\u8c03\u8bd5\u4fe1\u606f\n                                    \u7b2c 2 \u7ea7\uff1a\u663e\u793a\u6240\u6709\u4fe1\u606f\uff0c\u5305\u62ec\u5904\u7406\u4fe1\u606f\n\n    -i origin_firmware_path         \u6307\u5b9a\u7f16\u8bd1\u540e\u7684\u539f\u59cb\u56fa\u4ef6\u8def\u5f84\uff0c\u76ee\u524d\u53ea\u652f\u6301 bin \u6587\u4ef6\uff0chex \u6587\u4ef6\u683c\u5f0f\u3002\n\n    [-r ramcode_path]               \u6307\u5b9a\u8981\u52a0\u5bc6\u7684 ram \u4ee3\u7801\u8def\u5f84\u3002\n                                    \u4e8c\u8fdb\u5236\u6587\u4ef6\uff0cER_IROM2 \u53ef\u80fd\u662f\u7528\u4e8e MDK \u7f16\u8bd1\u7684\u9ed8\u8ba4\u540d\u79f0\u3002\n\n    [-o encrypted_firmware_path]    \u6307\u5b9a Release \u56fa\u4ef6\u8def\u5f84\uff0c\u5f53\u524d\u76f4\u63a5\u8f93\u51fa bin \u6587\u4ef6\u3001\n                                    \u5982\u679c\u672a\u6307\u5b9a\u8f93\u51fa\u8def\u5f84\uff0c\u5219\u9ed8\u8ba4\u4fdd\u5b58 origin_firmware_path (*_encrypted.bin)\u3002\n                                    \u9ed8\u8ba4\u4fdd\u5b58\u3002\n\n    -k 0xxxxxxxxxxxxxxxxx           \u6307\u5b9a\u7528\u4e8e\u52a0\u5bc6\u6570\u636e\u7684\u5bc6\u7801\uff0864 \u4f4d\uff09\u3002\n\n    -g [true|false]                 \u751f\u6210\u52a0\u5bc6\u4ea4\u6362\u77e9\u9635\u3002true \u5141\u8bb8\u91cd\u590d\uff0cfalse \u4e0d\u5141\u8bb8\u91cd\u590d\n")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"  \u5927\u62ec\u53f7{}\u8868\u793a\u4e00\u7ec4\u9009\u9879\uff0c\u5927\u62ec\u53f7[]\u8868\u793a\u53ef\u9009\u9009\u9879\u3002\u5982\u679c\u4e0d\u8f93\u5165\u8be5\u53c2\u6570\uff0c\u5c06\u4f7f\u7528\u9ed8\u8ba4\u53c2\u6570\uff0c\u6240\u6709\u5176\u4ed6\u53c2\u6570\u5747\u4e3a\u5fc5\u9009\u53c2\u6570\u3002")),(0,r.kt)("h3",{id:"cli_windows"},"5.5.5.2\uff1aWindows \u6f14\u793a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110151844181",src:n(15565).Z,width:"1711",height:"897"})),(0,r.kt)("h3",{id:"cli_linux"},"5.5.5.3\uff1aLinux \u6f14\u793a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20211127141803823",src:n(64689).Z,width:"1778",height:"1021"})),(0,r.kt)("h3",{id:"cli_MacOS"},"5.5.5.4\uff1aMacOS \u6f14\u793a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20211129110740754",src:n(70178).Z,width:"1604",height:"777"})),(0,r.kt)("h3",{id:"cli_IDE"},"5.5.5.5\uff1a\u4e0eIDE \u8fdb\u884c\u96c6\u6210"),(0,r.kt)("p",null,"\u8bf7\u53c2\u8003 ",(0,r.kt)("a",{parentName:"p",href:"#project_config"},"\u9879\u76ee\u914d\u7f6e\u7ae0\u8282")," \u4e0e IDE \u8fdb\u884c\u96c6\u6210\u3002 "),(0,r.kt)("h2",{id:"use_rtos"},"5.5.6\uff1a\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf"),(0,r.kt)("p",null,"\u5f53\u4f7f\u7528RTOS \u65f6\uff0c\u5982\u4f7f\u7528Free RTOS \u65f6\uff0c\u9002\u5f53\u8c03\u6574\u64cd\u4f5c\u7cfb\u7edf\u7684\u5806\u5927\u5c0f\uff0c\u4e0b\u9762\u662f Cube MX \u4e2d Free RTOS \u7684\u914d\u7f6e\u53c2\u8003"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110140325162",src:n(79434).Z,width:"732",height:"546"})),(0,r.kt)("h3",{id:"rtos_stack"},"5.5.6.1\uff1a\u4efb\u52a1\u6808\u5206\u914d"),(0,r.kt)("p",null,"\u5f53\u521b\u5efa\u52a0\u5bc6\u5e93\u6821\u9a8c\u4efb\u52a1\u65f6\uff0c\u8bf7\u9002\u5f53\u8c03\u6574 stack \u5927\u5c0f\uff0c\u907f\u514d\u52a0\u5bc6\u5e93\u6267\u884c\u6df1\u5ea6\u8fc7\u6df1\uff0c\u5bfc\u81f4\u6808\u6ea2\u51fa\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"}
1,'/* USER CODE BEGIN PV */\nosThreadId_t advance_software_protect_TaskHandle;\nconst osThreadAttr_t ASPLTask_attributes = {\n  .name = "advance_software_protect_task",\n  /* \u9700\u8981\u5c06\u52a0\u5bc6\u5e93\u7684stack \u8bbe\u7f6e\u5f97\u5927\u4e00\u4e9b\uff0c\u592a\u5c0f\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5806\u6808\u6ea2\u51fa\uff01 */\n  .stack_size = 1024 * 4,       \n  .priority = (osPriority_t) osPriorityNormal1,\n};\n\n/* USER CODE BEGIN 0 */\nvoid advance_software_protect_Task(void *argument)\n{\n  /* USER CODE BEGIN 5 */\n  /* init */\n  advance_software_protect_init();      \n  /* Infinite loop */\n  for(;;)\n  {\n    advance_software_protect_logger(ADV_INFO,"-------------OS Task in-------------\\r\\n");\n    /* sample */\n    advance_software_protect_sample();\n    \n    /* system status  */\n    advance_software_protect_status status;\n    if(!advance_software_protect_system_status_get(&status)){\n        advance_software_protect_logger(ADV_ERROR,"Abnormal access and modification of firmware detected !!! \\r\\n");\n    }\n    if(!status.m_signature_executed){\n        advance_software_protect_logger(ADV_ERROR,"Illegal removal of signature services !!! \\r\\n");\n    }\n    if(!status.m_flash_verify_executed){\n        advance_software_protect_logger(ADV_ERROR,"Illegal removal of flash verify services !!! \\r\\n");\n    }\n    if(!status.m_signature_executed){\n        advance_software_protect_logger(ADV_ERROR,"Illegal removal of anti debugger services !!! \\r\\n");\n    }\n      \n    advance_software_protect_logger(ADV_INFO,"-------------OS Task out-------------\\r\\n");\n    osDelay(100);\n  }\n  /* USER CODE END 5 */\n}\n')),(0,r.kt)("h3",{id:"rtos_stack"},"5.5.6.2\uff1a\u4efb\u52a1\u5806\u5206\u914d"),(0,r.kt)("p",null,"\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u4f7f\u7528\u65f6\uff0c\u6211\u4eec\u53ef\u901a\u8fc7 \u6ce8\u518c\u5806\u5206\u914d\u63a5\u53e3\uff0c\u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf\u7684\u5806\u6765\u7ba1\u7406\u5185\u5b58\uff0c\u53c2\u8003\u5982\u4e0b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},"/* \u6ce8\u518c\u5806\u5185\u5b58\u7ba1\u7406\u63a5\u53e3\u539f\u578b */\nbool advance_software_protect_set_mem_calloc_free_callback(calloc_func_cb, free_func_cb);\n    \n/* memory alloc & free */\nvoid *calloc_mem_func(size_t count, size_t size)\n{\n    void * obj = pvPortMalloc(count * size);            /* \u4f7f\u7528\u64cd\u4f5c\u7cfb\u7edf\u7684\u5806\u5185\u5b58\u5206\u914d */\n    if(obj){\n        memset(obj,0,count * size);                     /* \u5f53\u4f7f\u7528pvPortMalloc API \u65f6\uff0c\u4e00\u5b9a\u8981\u6e05 0 */\n    }\n    return obj;\n}\nvoid free_mem_func(void *blk_obj)\n{\n    vPortFree(blk_obj);                     /* \u91ca\u653e\u5bf9\u8c61\u63a5\u53e3 */\n}\n\n/*\n * IMPORTANT:\n * Do not encrypt the parent function () that contains the\n * advance_software_protect_encryption_code_loader!\n */\nvoid advance_software_protect_init()\n{\n    /* initial */\n    advance_software_protect_set_mem_calloc_free_callback(calloc_mem_func, free_mem_func);\n}\n")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"\u4ee5 Free RTOS \u4e3a\u4f8b\uff0c\u4e5f\u53ef\u4ee5\u7528 osMemoryPoolNew \u3001osMemoryPoolAlloc\u3001osMemoryPoolFree \u5806\u5185\u5b58\u7ba1\u7406\u63a5\u53e3\u6765\u505a\u52a0\u5bc6\u5e93\u5806\u5185\u5b58\u7684\u7ba1\u7406\u3002")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"\u5f53\u4f7f\u7528 pvPortMalloc \u65f6\uff0c\u4e00\u5b9a\u8981\u5c06\u5206\u914d\u7684\u5185\u5b58 \u6e05 0\u3002")),(0,r.kt)("h3",{id:"rtos_mix"},"5.5.6.3\uff1a\u6df7\u5408\u4f7f\u7528"),(0,r.kt)("p",null,"\u5f53\u548c\u64cd\u4f5c\u7cfb\u7edf\u6df7\u5408\u4f7f\u7528\uff0c\u5c06\u52a0\u5bc6\u5e93\u653e\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e4b\u5916\u8fd0\u884c\u65f6\uff0c\u6309\u7167\u4e4b\u524d\u7684\u601d\u8def\uff0c\u4f7f\u7528\u81ea\u5e26\u7684\u5806\uff0c\u5219\u8c03\u6574\u5de5\u7a0b\u9ed8\u8ba4\u7684\u5806\u6808\u5927\u5c0f\uff0c\u89c1 startup_stm32f103xg.s \u4e2d\u9ed8\u8ba4\u5806\u6808\u7684\u5927\u5c0f\u8c03\u6574\uff0c\u4e5f\u53ef\u4ee5\u5728\u751f\u6210\u9879\u76ee\u65f6\uff0c\u5728\u914d\u7f6e\u754c\u9762\u8fdb\u884c\u9884\u5206\u914d\uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"image-20250110142504993",src:n(37729).Z,width:"386",height:"269"})),(0,r.kt)("h2",{id:"feed_back"},"5.5.7\uff1a\u66f4\u591a"),(0,r.kt)("p",null,"\u5982\u679c\u5728\u4f7f\u7528\u4f7f\u7528\u672c\u52a0\u5bc6\u5e93\u65f6\uff0c\u9047\u5230\u95ee\u9898\u6216\u8005\u6709\u5efa\u8bae\u548c\u610f\u89c1\uff0c\u8bf7\u53cd\u9988\u7ed9\u6211\u4eec\uff01"),(0,r.kt)("p",null,"\u53cd\u9988\u90ae\u7bb1\uff1a",(0,r.kt)("a",{parentName:"p",href:"mailto:[email protected]"},"[email protected]")),(0,r.kt)("p",null,"\u5728\u7ebf\u8868\u5355\u53cd\u9988\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://www.PowerWriter.com/index/index/feedback.html"},"Power Writer \u53cd\u9988")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Alan(cshsoft ) @ICWorkshop \u7248\u6743\u6240\u6709 ")))}d.isMDXComponent=!0},41258:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GIF 2025-1-10 15-05-25-557b8a1f11912bfac999964fd26a18f6.gif"}
1,36548:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GIF 2025-1-15 13-49-38-7bbf0de32fab0a13b2a85ce0c77b601f.gif"},34730:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GIF 2025-1-15 13-51-20-ee1453b264ec7c07dc549ed0b01ad6ad.gif"},7312:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GIF 2025-1-16 11-21-09-17145e4a794fe2c79ceb68ec4f342051.gif"},62567:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GIF 2025-1-16 11-40-23-83ff4f6453dafb1453e2aad1a0377493.gif"},75852:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/GIF 2025-1-16 11-42-38-ad5a013ee9c41352ca5d850798b2f4ab.gif"},64689:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20211127141803823-e063c40e180a193cb9847b763537333f.png"},70178:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20211129110740754-9b1a259c07b923316746615d8e443781.png"},92665:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250109174809242-4f617219ecea09aa8074233ecda4ad46.png"},77048:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110112625465-0fdb573a563052db70bc84910a8bb945.png"},27059:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110112810711-c11e17d753f9e14c7b9dd1d06a45c42a.png"},10563:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110112837043-c8cf1ff4a93dbbe51edf8a1f388958a5.png"},99118:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110112932329-8dfccb52171c14f6c217335ff2d20790.png"},83936:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},68387:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},43841:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110134742280-f44608b19d4cd89339717f0d54c04325.png"},79434:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110140325162-6cba949ae492d63d417d58264e5843b3.png"},37729:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},15565:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110151844181-948f1ed6b89267d4dfe93d071dade210.png"},41377:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110153831028-00d0dbd463be30913f1adeb130d46890.png"},44950:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110153912982-715e94a33188a5048a81e8baa91f534d.png"},69845:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110154444006-d041747d2be62796cbfb520e791518fc.png"},15549:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110155403040-adad412ddb8731f73ea10c9724004507.png"},87471:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110155623028-bf6cb99900b56e9b06cc8c78d0ace988.png"},67081:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},86448:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110160746781-a45073a9f364f394960a96054886243a.png"},60903:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250110160810458-858796515c1c48ad9a9ff47530a058d2.png"},8842:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},31186:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250111095524300-7223aa849cb806a4bbd7178c50db7def.png"},5288:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250111100422421-dbcd85de580ba0dd4e2addae3bd00fba.png"},92112:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},93844:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250111102505833-a9ecd87a8ffb73f856a84f26d0a441bf.png"},83619:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250111102824593-efde6aa3674ace97608f0661aa5c42ca.png"},44911:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115133833741-072cd768d84d0da6c4e599dcd4f493a2.png"},45829:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115133904923-b28c8b75766e471360ad7c832b4db2a3.png"},9946:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115134854011-f1a391d11da25e24963a9c0363e78bf0.png"},42399:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115135211142-a041c4b2549b101020f98e6841b6db25.png"},26643:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115135430886-76686f04d467bda2d5aedbc8a3eea7fe.png"},26601:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115135707841-63835f19e2a71f783559419839b82a33.png"},54763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115135922084-4b4af53cb606b1fa455d13d4c6d399f8.png"},64203:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115140050505-1c5f0cc6b16944ca4412f151042aac30.png"},49468:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115140224757-f038a7a35314b796874b2af69e1c58cd.png"},13747:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250115140312306-94ddc4e2f8aac5b4dbde16514c85ad77.png"},51183:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116111707295-ba413894439a074a656825f1afcfb9f7.png"},29702:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116111736247-2ed4c92b07e3fb360defedf6dc5
1aa114.png"},26053:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116112647643-9a5c789125a09b609aa3430208b42746.png"},54546:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116112903692-2f329a2ca6ce2286d12a3e260e2b9d06.png"},59187:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,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"},25617:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116113002281-f9bcaf190cb26a293d5e5d08f5740341.png"},16868:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116113103073-49a066e82d41c29aa48b1152e9223e50.png"},11856:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116113618874-d768dfdff7fa34c9c5173a87f37239aa.png"},75888:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/image-20250116113723060-aa8bfff9f28c922e0513cb45461d8eb4.png"}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.