{"id":113638,"date":"2026-10-07T01:25:33","date_gmt":"2026-10-06T17:25:33","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/113638.html"},"modified":"2026-10-07T01:25:33","modified_gmt":"2026-10-06T17:25:33","slug":"%e6%b7%b1%e6%8c%96freertos%e5%86%85%e6%a0%b8%e5%ae%9e%e7%8e%b0%ef%bc%88%e4%b8%89%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/113638.html","title":{"rendered":"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09"},"content":{"rendered":"<h2>\u4e34\u754c\u6bb5\u4fdd\u62a4&#xff1a;<\/h2>\n<h3>&#xff08;1&#xff09;\u4ec0\u4e48\u662f\u4e34\u754c\u6bb5&#xff1a;<\/h3>\n<p>\u4e34\u754c\u6bb5\u7528\u4e00\u53e5\u8bdd\u6982\u62ec\u5c31\u662f\u4e00\u6bb5\u5728\u6267\u884c\u7684\u65f6\u5019\u4e0d\u80fd\u88ab\u4e2d\u65ad\u7684\u4ee3\u7801\u6bb5\u3002\u5728 FreeRTOS \u91cc\u9762&#xff0c;\u8fd9\u4e2a\u4e34\u754c\u6bb5\u6700\u5e38\u51fa\u73b0\u7684\u5c31\u662f\u5bf9\u5168\u5c40\u53d8\u91cf\u7684\u64cd\u4f5c&#xff0c;\u5168\u5c40\u53d8\u91cf\u5c31\u597d\u50cf\u662f\u4e00\u4e2a\u67aa\u628a\u5b50&#xff0c;\u8c01\u90fd\u53ef\u4ee5\u5bf9\u4ed6\u5f00\u67aa&#xff0c;\u4f46\u662f\u6211\u5f00\u67aa\u7684\u65f6\u5019&#xff0c;\u4f60\u5c31\u4e0d\u80fd\u5f00\u67aa&#xff0c;\u5426\u5219\u5c31\u4e0d\u77e5\u9053\u662f\u8c01\u547d\u4e2d\u4e86\u9776\u5b50\u3002<\/p>\n<p>**\u90a3\u4e48\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4e34\u754c\u6bb5\u4f1a\u88ab\u6253\u65ad&#xff1f;\u4e00\u4e2a\u662f\u7cfb\u7edf\u8c03\u5ea6&#xff0c;\u8fd8\u6709\u4e00\u4e2a\u5c31\u662f\u5916\u90e8\u4e2d\u65ad\u3002**\u5728FreeRTOS&#xff0c;\u7cfb\u7edf\u8c03\u5ea6&#xff0c;\u6700\u7ec8\u4e5f\u662f\u4ea7\u751f PendSV \u4e2d\u65ad&#xff0c;\u5728 PendSV Handler \u91cc\u9762\u5b9e\u73b0\u4efb\u52a1\u7684\u5207\u6362&#xff0c;\u6240\u4ee5\u8fd8\u662f\u53ef\u4ee5\u5f52\u7ed3\u4e3a\u4e2d\u65ad\u3002\u65e2\u7136\u8fd9\u6837&#xff0c;FreeRTOS \u5bf9\u4e34\u754c\u6bb5\u7684\u4fdd\u62a4\u6700\u7ec8\u8fd8\u662f\u56de\u5230\u5bf9\u4e2d\u65ad\u7684\u5f00\u548c\u5173\u7684\u63a7\u5236\u3002<\/p>\n<h3>&#xff08;2&#xff09;Cortex-M \u5185\u6838\u5feb\u901f\u5173\u4e2d\u65ad\u6307\u4ee4<\/h3>\n<p>\u4e3a\u4e86\u5feb\u901f\u5730\u5f00\u5173\u4e2d\u65ad&#xff0c; Cortex-M \u5185\u6838\u4e13\u95e8\u8bbe\u7f6e\u4e86\u4e00\u6761 CPS \u6307\u4ee4&#xff0c;\u6709 4 \u79cd\u7528\u6cd5&#xff0c;\u5177\u4f53\u89c1\u4ee3\u7801\u6e05\u5355<\/p>\n<p>CPSID I <span class=\"token punctuation\">;<\/span>PRIMASK<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span> <span class=\"token punctuation\">;<\/span>\u5173\u4e2d\u65ad<br \/>\nCPSIE I <span class=\"token punctuation\">;<\/span>PRIMASK<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span> <span class=\"token punctuation\">;<\/span>\u5f00\u4e2d\u65ad<br \/>\nCPSID F <span class=\"token punctuation\">;<\/span>FAULTMASK<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span> <span class=\"token punctuation\">;<\/span>\u5173\u5f02\u5e38<br \/>\nCPSIE F <span class=\"token punctuation\">;<\/span>FAULTMASK<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span> <span class=\"token punctuation\">;<\/span>\u5f00\u5f02\u5e38<\/p>\n<p>PRIMASK \u548c FAULTMAST \u662f Cortex-M\u5185\u6838 \u91cc\u9762\u4e09\u4e2a\u4e2d\u65ad\u5c4f\u853d\u5bc4\u5b58\u5668\u4e2d\u7684\u4e24\u4e2a&#xff0c;\u8fd8\u6709\u4e00\u4e2a\u662f BASEPRI&#xff0c;\u6709\u5173\u8fd9\u4e09\u4e2a\u5bc4\u5b58\u5668\u7684\u8be6\u7ec6\u7528\u6cd5\u89c1\u8868\u683c&#xff1a;<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/10\/20261006172528-6ac52f0828eb0.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><br \/>\n\u4f46\u662f&#xff0c;\u5728 FreeRTOS \u4e2d&#xff0c;\u5bf9\u4e2d\u65ad\u7684\u5f00\u548c\u5173\u662f\u901a\u8fc7\u64cd\u4f5c BASEPRI \u5bc4\u5b58\u5668\u6765\u5b9e\u73b0\u7684&#xff0c;\u5373\u5927\u4e8e\u7b49\u4e8e BASEPRI \u7684\u503c\u7684\u4e2d\u65ad\u4f1a\u88ab\u5c4f\u853d&#xff0c;\u5c0f\u4e8e BASEPRI \u7684\u503c\u7684\u4e2d\u65ad\u5219\u4e0d\u4f1a\u88ab\u5c4f\u853d&#xff0c;\u4e0d\u53d7FreeRTOS \u7ba1\u7406\u3002\u7528\u6237\u53ef\u4ee5\u8bbe\u7f6e BASEPRI \u7684\u503c\u6765\u9009\u62e9\u6027\u7684\u7ed9\u4e00\u4e9b\u975e\u5e38\u7d27\u6025\u7684\u4e2d\u65ad\u7559\u4e00\u6761\u540e\u8def\u3002<\/p>\n<h3>&#xff08;3&#xff09;\u5173\u4e2d\u65ad<\/h3>\n<p>FreeRTOS \u5173\u4e2d\u65ad\u7684\u51fd\u6570\u5728 portmacro.h \u4e2d\u5b9a\u4e49&#xff0c;\u5206\u4e0d\u5e26\u8fd4\u56de\u503c\u548c\u5e26\u8fd4\u56de\u503c\u4e24\u79cd&#xff0c;\u5177\u4f53\u5b9e\u73b0\u89c1\u4ee3\u7801<\/p>\n<p><span class=\"token comment\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*\/<\/span><br \/>\n<span class=\"token comment\">\/* \u4e0d\u5e26\u8fd4\u56de\u503c\u7684\u5173\u4e2d\u65ad\u51fd\u6570&#xff0c;\u4e0d\u80fd\u5d4c\u5957&#xff0c;\u4e0d\u80fd\u5728\u4e2d\u65ad\u91cc\u9762\u4f7f\u7528 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> ulNewBASEPRI <span class=\"token operator\">&#061;<\/span> configMAX_SYSCALL_INTERRUPT_PRIORITY<span class=\"token punctuation\">;<\/span><\/p>\n<p>__asm<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* Set BASEPRI to the max syscall priority to effect a critical<br \/>\nsection. *\/<\/span><br \/>\nmsr basepri<span class=\"token punctuation\">,<\/span> ulNewBASEPRI<br \/>\ndsb<br \/>\nisb<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*\/<\/span><\/p>\n<p><span class=\"token comment\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*\/<\/span><br \/>\n<span class=\"token comment\">\/* \u5e26\u8fd4\u56de\u503c\u7684\u5173\u4e2d\u65ad\u51fd\u6570&#xff0c;\u53ef\u4ee5\u5d4c\u5957&#xff0c;\u53ef\u4ee5\u5728\u4e2d\u65ad\u91cc\u9762\u4f7f\u7528 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token class-name\">uint32_t<\/span> <span class=\"token function\">ulPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> ulReturn<span class=\"token punctuation\">,<\/span> ulNewBASEPRI <span class=\"token operator\">&#061;<\/span> configMAX_SYSCALL_INTERRUPT_PRIORITY<span class=\"token punctuation\">;<\/span><\/p>\n<p>__asm<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* Set BASEPRI to the max syscall priority to effect a critical<br \/>\nsection. *\/<\/span><br \/>\nmrs ulReturn<span class=\"token punctuation\">,<\/span> basepri<br \/>\nmsr basepri<span class=\"token punctuation\">,<\/span> ulNewBASEPRI<br \/>\ndsb<br \/>\nisb<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> ulReturn<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*\/<\/span><\/p>\n<h4>&#xff08;3.1&#xff09;\u4e0d\u5e26\u8fd4\u56de\u503c\u7684\u5173\u4e2d\u65ad\u51fd\u6570<\/h4>\n<p>\u4e0d\u5e26\u8fd4\u56de\u503c\u7684\u5173\u4e2d\u65ad\u51fd\u6570&#xff0c;\u4e0d\u80fd\u5d4c\u5957&#xff0c;\u4e0d\u80fd\u5728\u4e2d\u65ad\u91cc\u9762\u4f7f\u7528\u3002\u4e0d\u5e26\u8fd4\u56de\u503c\u7684\u610f\u601d\u662f&#xff1a;\u5728\u5f80 BASEPRI \u5199\u5165\u65b0\u7684\u503c\u7684\u65f6\u5019&#xff0c;\u4e0d\u7528\u5148\u5c06 BASEPRI \u7684\u503c\u4fdd\u5b58\u8d77\u6765&#xff0c;\u5373\u4e0d\u7528\u7ba1\u5f53\u524d\u7684\u4e2d\u65ad\u72b6\u6001\u662f\u600e\u4e48\u6837\u7684&#xff0c;\u65e2\u7136\u4e0d\u7528\u7ba1\u5f53\u524d\u7684\u4e2d\u65ad\u72b6\u6001&#xff0c;\u4e5f\u5c31\u610f\u5473\u7740\u8fd9\u6837\u7684\u51fd\u6570\u4e0d\u80fd\u5728\u4e2d\u65ad\u91cc\u9762\u8c03\u7528\u3002<\/p>\n<p>\u5728vPortRaiseBASEPRI&#xff08;&#xff09;\u51fd\u6570\u4e2d&#xff1a;<\/p>\n<p>uint32_t ulNewBASEPRI &#061; configMAX_SYSCALL_INTERRUPT_PRIORITY&#xff1a;  configMAX_SYSCALL_INTERRUPT_PRIORITY \u662f \u4e00 \u4e2a \u5728FreeRTOSConfig.h \u4e2d\u5b9a\u4e49\u7684\u5b8f&#xff0c;\u5373\u8981\u5199\u5165\u5230 BASEPRI \u5bc4\u5b58\u5668\u7684\u503c\u3002\u8be5\u5b8f\u9ed8\u8ba4\u5b9a\u4e49\u4e3a 191&#xff08;1011 1111&#xff09;&#xff0c;\u9ad8\u56db\u4f4d\u6709\u6548&#xff0c;\u5373\u7b49\u4e8e 0xb0\u6216\u8005\u662f 11&#xff0c;\u5373\u4f18\u5148\u7ea7\u5927\u4e8e\u7b49\u4e8e 11 \u7684\u4e2d\u65ad\u90fd\u4f1a\u88ab\u5c4f\u853d&#xff0c;11 \u4ee5\u5185\u7684\u4e2d\u65ad\u5219\u4e0d\u53d7 FreeRTOS \u7ba1\u7406\u3002<\/p>\n<p>msr basepri, ulNewBASEPRI&#xff1a;  \u5c06 configMAX_SYSCALL_INTERRUPT_PRIORITY \u7684\u503c\u5199\u5165BASEPRI \u5bc4\u5b58\u5668&#xff0c;\u5b9e\u73b0\u5173\u4e2d\u65ad&#xff08;\u51c6\u786e\u6765\u8bf4\u662f\u5173\u90e8\u5206\u4e2d\u65ad&#xff09;\u3002<\/p>\n<p>&#xff08;\u8865\u5145&#xff1a;\u50cf\u4e4b\u524d\u7684MSP\u3001SPS\u3001\u8fd8\u6709\u73b0\u5728\u7684BASEPRI&#xff0c;\u8fd9\u4e9b\u7279\u6b8a\u5bc4\u5b58\u5668\u4e0d\u5728\u5185\u5b58\u91cc&#xff0c;\u5c31\u5728 CPU \u5185\u6838\u5185\u90e8&#xff0c;\u6240\u4ee5\u6211\u4eec\u53bb\u8bfb\u3001\u5199\u7684\u65f6\u5019\u662f\u628a\u5185\u6838\u5185\u90e8\u7684\u4e00\u4e2a\u7269\u7406\u5bc4\u5b58\u5668\u76f4\u63a5\u642c\u8fdb\u901a\u7528\u5bc4\u5b58\u5668&#xff0c;\u4e0d\u8d70\u603b\u7ebf\u3001\u4e0d\u7ecf\u8fc7\u5185\u5b58\u3002<\/p>\n<p>\u7c7b\u6bd4&#xff1a;\u5916\u8bbe\u5bc4\u5b58\u5668\u662f\u5c0f\u533a\u5feb\u9012\u67dc\u2014\u2014\u6709\u67dc\u53f7&#xff08;\u5730\u5740&#xff09;&#xff0c;\u5f97\u8d70\u4e00\u8d9f&#xff08;\u603b\u7ebf&#xff09;\u53bb\u53d6&#xff1b;\u5185\u6838\u5bc4\u5b58\u5668\u662f\u53e3\u888b\u91cc\u7684\u4e1c\u897f\u2014\u2014\u6ca1\u6709\u95e8\u724c\u53f7&#xff0c;\u4f38\u624b\u5c31\u638f&#xff08;mrs\/msr&#xff09;\u3002<\/p>\n<p>\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48 PendSV \u91cc\u53d6\u4efb\u52a1\u6808\u9876\u5fc5\u987b\u7528 &#xff08; mrs r0, psp&#xff1a; &#xff09; PSP\u538b\u6839\u6ca1\u6709\u5730\u5740&#xff0c;\u4f60\u60f3 ldr \u90fd\u6ca1\u5730\u65b9\u586b\u5730\u5740\u3002\u800c\u6302\u8d77 PendSV \u5374\u80fd\u5199 0xE000ED04\u2014\u2014\u56e0\u4e3a ICSR \u662f\u6620\u5c04\u5230\u5185\u5b58\u7a7a\u95f4\u7684\u5916\u8bbe\u5bc4\u5b58\u5668&#xff0c;\u6709\u5730\u5740\u3002&#xff09;<\/p>\n<h4>&#xff08;3.2&#xff09;\u5e26\u8fd4\u56de\u503c\u7684\u5173\u4e2d\u65ad\u51fd\u6570<\/h4>\n<p>\u5e26\u8fd4\u56de\u503c\u7684\u5173\u4e2d\u65ad\u51fd\u6570&#xff0c;\u53ef\u4ee5\u5d4c\u5957&#xff0c;\u53ef\u4ee5\u5728\u4e2d\u65ad\u91cc\u9762\u4f7f\u7528\u3002\u5e26\u8fd4\u56de\u503c\u7684\u610f\u601d\u662f&#xff1a;\u5728\u5f80 BASEPRI \u5199\u5165\u65b0\u7684\u503c\u7684\u65f6\u5019&#xff0c;\u5148\u5c06 BASEPRI \u7684\u503c\u4fdd\u5b58\u8d77\u6765&#xff0c;\u5728\u66f4\u65b0\u5b8cBASEPRI \u7684\u503c\u7684\u65f6\u5019&#xff0c;\u5c06\u4e4b\u524d\u4fdd\u5b58\u597d\u7684 BASEPRI \u7684\u503c\u8fd4\u56de&#xff0c;\u8fd4\u56de\u7684\u503c\u4f5c\u4e3a\u5f62\u53c2\u4f20\u5165\u5f00\u4e2d\u65ad\u51fd\u6570\u3002<\/p>\n<p>\u5728ulPortRaiseBASEPRI&#xff08;&#xff09;\u51fd\u6570\u4e2d&#xff1a;<\/p>\n<p>uint32_t ulRetu\u5728\u8fd9\u91cc\u63d2\u5165\u4ee3\u7801\u7247rn, ulNewBASEPRI &#061; configMAX_SYSCALL_INTERRUPT_PRIORITY&#xff1a; configMAX_SYSCALL_INTERRUPT_PRIORITY \u662f \u4e00 \u4e2a \u5728FreeRTOSConfig.h \u4e2d\u5b9a\u4e49\u7684\u5b8f&#xff0c;\u5373\u8981\u5199\u5165\u5230 BASEPRI \u5bc4\u5b58\u5668\u7684\u503c\u3002\u8be5\u5b8f\u9ed8\u8ba4\u5b9a\u4e49\u4e3a 191&#xff0c;\u9ad8\u56db\u4f4d\u6709\u6548&#xff0c;\u5373\u7b49\u4e8e 0xb0&#xff0c;\u6216\u8005\u662f 11&#xff0c;\u5373\u4f18\u5148\u7ea7\u5927\u4e8e\u7b49\u4e8e 11 \u7684\u4e2d\u65ad\u90fd\u4f1a\u88ab\u5c4f\u853d&#xff0c;11 \u4ee5\u5185\u7684\u4e2d\u65ad\u5219\u4e0d\u53d7 FreeRTOS \u7ba1\u7406<\/p>\n<p>mrs ulReturn, basepri&#xff1a; mrs \u662f\u8bfb\u53d6 BASEPRI \u7684\u5f53\u524d\u503c\u5230 ulReturn&#xff08;\u4fdd\u5b58\u65e7\u503c&#xff09;&#xff0c;\u8bb0\u5f55\u5f53\u524d\u54ea\u4e9b\u4e2d\u65ad\u88ab\u5173\u95ed\u3002<\/p>\n<p>msr basepri, ulNewBASEPRI&#xff1a; \u66f4\u65b0 BASEPRI \u7684\u503c\u3002<\/p>\n<p>return ulReturn&#xff1a;  \u8fd4\u56de\u539f\u6765 BASEPRI \u7684\u503c\u3002<\/p>\n<h3>&#xff08;4&#xff09;\u5f00\u4e2d\u65ad&#xff1a;<\/h3>\n<p>FreeRTOS \u5f00\u4e2d\u65ad\u7684\u51fd\u6570\u5728 portmacro.h \u4e2d\u5b9a\u4e49&#xff0c;\u5177\u4f53\u5b9e\u73b0\u89c1\u4ee3\u7801\u6e05\u5355&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* \u4e0d\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7684\u5f00\u4e2d\u65ad\u51fd\u6570 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portENABLE_INTERRUPTS<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u5e26\u4e2d\u65ad\u4fdd\u62a4\u7684\u5f00\u4e2d\u65ad\u51fd\u6570 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portCLEAR_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*\/<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token class-name\">uint32_t<\/span> ulBASEPRI <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n__asm<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* Barrier instructions are not used as this function is only used to<br \/>\nlower the BASEPRI value. *\/<\/span><br \/>\nmsr basepri<span class=\"token punctuation\">,<\/span> ulBASEPRI<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*\/<\/span><\/p>\n<p>vPortSetBASEPRI( 0 )\u51fd\u6570&#xff1a; \u4e0d\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7684\u5f00\u4e2d\u65ad\u51fd\u6570&#xff0c;\u76f4\u63a5\u5c06 BASEPRI \u7684\u503c\u8bbe\u7f6e\u4e3a 0&#xff0c;\u4e0eportDISABLE_INTERRUPTS()\u6210\u5bf9\u4f7f\u7528\u3002<\/p>\n<p>**vPortSetBASEPRI(x)\u51fd\u6570&#xff1a;**\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7684\u5f00\u4e2d\u65ad\u51fd\u6570&#xff0c;\u5c06\u4e0a\u4e00\u6b21\u5173\u4e2d\u65ad\u65f6\u4fdd\u5b58\u7684 BASEPRI \u7684\u503c\u4f5c\u4e3a\u5f62\u53c2 &#xff0c;\u4e0eportSET_INTERRUPT_MASK_FROM_ISR()\u6210\u5bf9\u4f7f\u7528\u3002<\/p>\n<p>void vPortSetBASEPRI( uint32_t ulBASEPRI )&#xff1a; \u5f00\u4e2d\u65ad\u51fd\u6570&#xff0c;\u5177\u4f53\u662f\u5c06\u4f20\u8fdb\u6765\u7684\u5f62\u53c2\u66f4\u65b0\u5230 BASEPRI \u5bc4\u5b58\u5668\u3002\u6839\u636e\u4f20\u8fdb\u6765\u5f62\u53c2\u7684\u4e0d\u540c&#xff0c;\u5206\u4e3a\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c\u4e0e\u975e\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c\u3002<\/p>\n<h3>&#xff08;5&#xff09;\u8fdb\u5165\/\u9000\u51fa\u4e34\u754c\u6bb5\u7684\u5b8f<\/h3>\n<p>\u8fdb\u5165\u548c\u9000\u51fa\u4e34\u754c\u6bb5\u7684\u5b8f\u5728 task.h \u4e2d\u5b9a\u4e49&#xff0c;\u5177\u4f53\u89c1\u4ee3\u7801\u6e05\u5355&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskENTER_CRITICAL<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">portENTER_CRITICAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskENTER_CRITICAL_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">portSET_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskEXIT_CRITICAL<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">portEXIT_CRITICAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskEXIT_CRITICAL_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> x <span class=\"token punctuation\">)<\/span> <span class=\"token function\">portCLEAR_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token punctuation\">(<\/span> x <span class=\"token punctuation\">)<\/span> <\/span><\/span><\/p>\n<p>\u8fdb\u5165\u548c\u9000\u51fa\u4e34\u754c\u6bb5\u7684\u5b8f\u5206\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c\u548c\u975e\u4e2d\u65ad\u7248\u672c&#xff0c;\u4f46\u6700\u7ec8\u90fd\u662f\u901a\u8fc7\u5f00\/\u5173\u4e2d\u65ad\u6765\u5b9e\u73b0\u3002\u6709\u5173\u5f00\/\u5149\u4e2d\u65ad\u7684\u5e95\u5c42\u4ee3\u7801\u6211\u4eec\u5df2\u7ecf\u8bb2\u89e3&#xff0c;\u90a3\u4e48\u63a5\u4e0b\u6765\u7684\u9000\u51fa\u548c\u8fdb\u5165\u4e34\u754c\u6bb5\u7684\u4ee3\u7801\u914d\u5957\u6ce8\u91ca\u6765\u7406\u89e3\u5373\u53ef\u3002<\/p>\n<h4>&#xff08;5.1&#xff09;\u8fdb\u5165\u4e34\u754c\u6bb5<\/h4>\n<p>1.\u4e0d\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c&#xff0c;\u4e0d\u80fd\u5d4c\u5957<\/p>\n<p><span class=\"token comment\">\/*<br \/>\n*************************************************************************<br \/>\n*                             \u4e34\u754c\u6bb5\u76f8\u5173\u51fd\u6570<br \/>\n*************************************************************************<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortEnterCritical<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">portDISABLE_INTERRUPTS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nuxCriticalNesting<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* This is not the interrupt safe version of the enter critical function so<br \/>\nassert() if it is being called from an interrupt context.  Only API<br \/>\nfunctions that end in &#034;FromISR&#034; can be used in an interrupt.  Only assert if<br \/>\nthe critical nesting count is 1 to protect against recursive calls if the<br \/>\nassert function also uses a critical section. *\/<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> uxCriticalNesting <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/configASSERT( ( portNVIC_INT_CTRL_REG &amp; portVECTACTIVE_MASK ) &#061;&#061; 0 );<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortExitCritical<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/configASSERT( uxCriticalNesting );<\/span><br \/>\nuxCriticalNesting<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> uxCriticalNesting <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">portENABLE_INTERRUPTS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>uxCriticalNesting&#xff1a; \u662f\u5728 port.c \u4e2d\u5b9a\u4e49\u7684\u9759\u6001\u53d8\u91cf&#xff0c;\u8868\u793a\u4e34\u754c\u6bb5\u5d4c\u5957\u8ba1\u6570 \u5668 &#xff0c; \u9ed8 \u8ba4 \u521d \u59cb \u5316 \u4e3a 0xaaaaaaaa &#xff0c; \u5728 \u8c03 \u5ea6 \u5668 \u542f \u52a8 \u65f6 \u4f1a \u88ab \u91cd \u65b0 \u521d \u59cb \u5316 \u4e3a 0 &#xff1a;vTaskStartScheduler()-&gt;xPortStartScheduler()-&gt;uxCriticalNesting &#061; 0\u3002<\/p>\n<p>if( uxCriticalNesting &#061;&#061; 1 )&#xff1a; \u5982\u679c uxCriticalNesting \u7b49\u4e8e 1&#xff0c;\u5373\u4e00\u5c42\u5d4c\u5957&#xff0c;\u8981\u786e\u4fdd\u5f53\u524d\u6ca1\u6709\u4e2d\u65ad\u6d3b\u8dc3&#xff0c;\u5373\u5185\u6838\u5916\u8bbe SCB \u4e2d\u7684\u4e2d\u65ad\u548c\u63a7\u5236\u5bc4\u5b58\u5668 SCB_ICSR \u7684\u4f4e 8 \u4f4d\u8981\u7b49\u4e8e 0\u3002<\/p>\n<p>\u8fdb\u5165\u4e34\u754c\u6bb5&#xff0c;\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c\u4e14\u53ef\u4ee5\u5d4c\u5957\u7684\u4ee3\u7801\u5b9e\u73b0\u5177\u4f53\u89c1\u4ee3\u7801\u6e05\u5355<\/p>\n<p>2.\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c&#xff0c;\u53ef\u4ee5\u5d4c\u5957<\/p>\n<p><span class=\"token comment\">\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u8fdb\u5165\u4e34\u754c\u6bb5&#xff0c;\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c&#xff0c;\u53ef\u4ee5\u5d4c\u5957&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<\/span><br \/>\n<span class=\"token comment\">\/* \u5728 task.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskENTER_CRITICAL_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">portSET_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portSET_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">ulPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token class-name\">uint32_t<\/span> <span class=\"token function\">ulPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> ulReturn<span class=\"token punctuation\">,<\/span> ulNewBASEPRI <span class=\"token operator\">&#061;<\/span> configMAX_SYSCALL_INTERRUPT_PRIORITY<span class=\"token punctuation\">;<\/span><\/p>\n<p>__asm<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nmrs ulReturn<span class=\"token punctuation\">,<\/span> basepri<br \/>\nmsr basepri<span class=\"token punctuation\">,<\/span> ulNewBASEPRI<br \/>\ndsb<br \/>\nisb<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">return<\/span> ulReturn<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>&#xff08;5.2 &#xff09;\u9000\u51fa\u4e34\u754c\u6bb5<\/h4>\n<p>\u9000\u51fa\u4e34\u754c\u6bb5&#xff0c;\u4e0d\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c\u4e14\u4e0d\u80fd\u5d4c\u5957\u7684\u4ee3\u7801\u5b9e\u73b0\u5177\u4f53\u89c1\u4ee3\u7801\u6e05\u5355<\/p>\n<li>\u4e0d\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7684\u7248\u672c&#xff0c;\u4e0d\u80fd\u5d4c\u5957<\/li>\n<p><span class=\"token comment\">\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u9000\u51fa\u4e34\u754c\u6bb5&#xff0c;\u4e0d\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c&#xff0c;\u4e0d\u80fd\u5d4c\u5957&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<\/span><br \/>\n<span class=\"token comment\">\/* \u5728 task.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskEXIT_CRITICAL<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">portEXIT_CRITICAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portEXIT_CRITICAL<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">vPortExitCritical<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 port.c \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortExitCritical<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">configASSERT<\/span><span class=\"token punctuation\">(<\/span> uxCriticalNesting <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nuxCriticalNesting<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span> uxCriticalNesting <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">portENABLE_INTERRUPTS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portENABLE_INTERRUPTS<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token class-name\">uint32_t<\/span> ulBASEPRI <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n__asm<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nmsr basepri<span class=\"token punctuation\">,<\/span> ulBASEPRI<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<li>\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7684\u7248\u672c&#xff0c;\u53ef\u4ee5\u5d4c\u5957<\/li>\n<p><span class=\"token comment\">\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u9000\u51fa\u4e34\u754c\u6bb5&#xff0c;\u5e26\u4e2d\u65ad\u4fdd\u62a4\u7248\u672c&#xff0c;\u53ef\u4ee5\u5d4c\u5957&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<\/span><br \/>\n<span class=\"token comment\">\/* \u5728 task.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">taskEXIT_CRITICAL_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> x <span class=\"token punctuation\">)<\/span> <span class=\"token function\">portCLEAR_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token punctuation\">(<\/span> x <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portCLEAR_INTERRUPT_MASK_FROM_ISR<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span>x<span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728 portmacro.h \u4e2d\u5b9a\u4e49 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token class-name\">uint32_t<\/span> ulBASEPRI <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n__asm<br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nmsr basepri<span class=\"token punctuation\">,<\/span> ulBASEPRI<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>&#xff08;6&#xff09;\u4e34\u754c\u6bb5\u4ee3\u7801\u7684\u5e94\u7528<\/h3>\n<p>\u5728 FreeRTOS \u4e2d&#xff0c;\u5bf9\u4e34\u754c\u6bb5\u7684\u4fdd\u62a4\u51fa\u73b0\u5728\u4e24\u79cd\u573a\u5408&#xff0c;\u4e00\u79cd\u662f\u5728\u4e2d\u65ad\u573a\u5408\u4e00\u79cd\u662f\u5728\u975e\u4e2d\u65ad\u573a\u5408&#xff0c;\u5177\u4f53\u7684\u5e94\u7528\u89c1\u3002<\/p>\n<p><span class=\"token comment\">\/* \u5728\u4e2d\u65ad\u573a\u5408&#xff0c;\u4e34\u754c\u6bb5\u53ef\u4ee5\u5d4c\u5957 *\/<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> ulReturn<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/* \u8fdb\u5165\u4e34\u754c\u6bb5&#xff0c;\u4e34\u754c\u6bb5\u53ef\u4ee5\u5d4c\u5957 *\/<\/span><br \/>\nulReturn <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">taskENTER_CRITICAL_FROM_ISR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u4e34\u754c\u6bb5\u4ee3\u7801 *\/<\/span><\/p>\n<p><span class=\"token comment\">\/* \u9000\u51fa\u4e34\u754c\u6bb5 *\/<\/span><br \/>\n<span class=\"token function\">taskEXIT_CRITICAL_FROM_ISR<\/span><span class=\"token punctuation\">(<\/span> ulReturn <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5728\u975e\u4e2d\u65ad\u573a\u5408&#xff0c;\u4e34\u754c\u6bb5\u4e0d\u80fd\u5d4c\u5957 *\/<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* \u8fdb\u5165\u4e34\u754c\u6bb5 *\/<\/span><br \/>\n<span class=\"token function\">taskENTER_CRITICAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u4e34\u754c\u6bb5\u4ee3\u7801 *\/<\/span><\/p>\n<p><span class=\"token comment\">\/* \u9000\u51fa\u4e34\u754c\u6bb5*\/<\/span><br \/>\n<span class=\"token function\">taskEXIT_CRITICAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>&#xff08;7&#xff09;\u8fd9\u6837\u770b\u8d77\u6765\u5f88\u4e71&#xff0c;\u4e0b\u9762\u603b\u7ed3\u4e00\u4e0b\u5c31\u6e05\u695a\u4e86&#xff1a;<\/h3>\n<p>\u4e3a\u4ec0\u4e48\u5b9a\u4e49\u8fd9\u4e48\u591a\u5b8f&#xff1a;\u4e09\u5c42\u5206\u5de5<\/p>\n<p>FreeRTOS \u8981\u8dd1\u5728\u51e0\u5341\u79cd\u5185\u6838\u4e0a&#xff08;M3\u3001M4\u3001RISC-V\u2026\u2026&#xff09;&#xff0c;\u6bcf\u79cd\u5185\u6838\u5173\u4e2d\u65ad\u7684\u6307\u4ee4\u90fd\u4e0d\u4e00\u6837\u3002\u6240\u4ee5\u5206\u6210\u4e09\u5c42&#xff1a;<\/p>\n<p>taskENTER_CRITICAL()            \u2190 \u7528\u6237\u5c42&#xff1a;\u4f60\u5199\u7a0b\u5e8f\u53ea\u7ba1\u62e8\u8fd9\u4e2a&#034;\u603b\u673a\u53f7\u7801&#034;<br \/>\n    &#061; portENTER_CRITICAL()      \u2190 \u79fb\u690d\u5c42&#xff1a;\u6362\u5185\u6838\u65f6\u53ea\u6539\u8fd9\u4e00\u5c42<br \/>\n    &#061; vPortRaiseBASEPRI()       \u2190 \u5e95\u5c42&#xff1a;msr basepri, 191&#xff08;\u771f\u6b63\u529e\u4e8b\u7684\u6c47\u7f16&#xff09;<\/p>\n<p>\u7c7b\u6bd4&#xff1a;\u603b\u673a\u53f7\u7801 \u2192 \u5185\u90e8\u8f6c\u63a5\u53f0 \u2192 \u5177\u4f53\u529e\u4e8b\u5458\u3002\u4f60\u6c38\u8fdc\u62e8\u540c\u4e00\u4e2a\u53f7\u7801&#xff1b;\u516c\u53f8\u642c\u5230\u522b\u7684\u697c&#xff08;\u6362\u5185\u6838&#xff09;&#xff0c;\u53ea\u6539\u8f6c\u63a5\u8868&#xff0c;\u4f60\u7684\u53f7\u7801\u4e0d\u53d8\u3002\u8fd9\u5c31\u662f&#034;\u8df3\u6765\u8df3\u53bb&#034;\u7684\u5168\u90e8\u539f\u56e0\u2014\u2014\u4f60\u53ea\u8ddf\u7b2c\u4e00\u5c42\u6253\u4ea4\u9053&#xff0c;\u540e\u9762\u4e24\u5c42\u662f\u79fb\u690d\u8005\u7684\u4e8b\u3002<\/p>\n<p>\u4e3a\u4ec0\u4e48\u5206&#034;\u4e2d\u65ad\u7248&#034;\u548c&#034;\u975e\u4e2d\u65ad\u7248&#034;\u4e24\u5957&#xff1a;\u4e00\u6761\u89c4\u5219<\/p>\n<table>\n<tr>\u4efb\u52a1\u91cc\u7528&#xff08;\u975e\u4e2d\u65ad\u7248&#xff09;\u4e2d\u65ad\u91cc\u7528&#xff08;FROM_ISR \u7248&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>\u8fdb\u5165<\/td>\n<td>taskENTER_CRITICAL()<\/td>\n<td>ulReturn &#061; taskENTER_CRITICAL_FROM_ISR()<\/td>\n<\/tr>\n<tr>\n<td>\u9000\u51fa<\/td>\n<td>taskEXIT_CRITICAL()<\/td>\n<td>taskEXIT_CRITICAL_FROM_ISR(ulReturn)<\/td>\n<\/tr>\n<tr>\n<td>\u5d4c\u5957\u9760\u4ec0\u4e48<\/td>\n<td>\u8ba1\u6570\u5668 uxCriticalNesting&#xff08;\u6700\u5916\u5c42\u9000\u51fa\u624d\u771f\u6b63\u5f00\u4e2d\u65ad&#xff09;<\/td>\n<td>\u4fdd\u5b58\u65e7\u503c\u3001\u9000\u51fa\u65f6\u6062\u590d\u65e7\u503c<\/td>\n<\/tr>\n<tr>\n<td>\u9000\u51fa\u52a8\u4f5c<\/td>\n<td>\u76f4\u63a5\u5199 0&#xff08;\u5168\u5f00&#xff09;<\/td>\n<td>\u6062\u590d\u6765\u65f6\u72b6\u6001&#xff08;\u4e0d\u80fd\u5199 0&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u6df7\u7528&#xff1f; \u56e0\u4e3a\u4efb\u52a1\u91cc\u8fdb\u4e34\u754c\u6bb5\u4e4b\u524d&#xff0c;\u4e2d\u65ad\u672c\u6765\u5c31\u662f\u5168\u5f00\u7684\u2014\u2014\u9000\u51fa\u5199 0 \u6ca1\u6bdb\u75c5\u3002\u4f46\u4e2d\u65ad\u91cc\u8fdb\u4e34\u754c\u6bb5\u4e4b\u524d&#xff0c;BASEPRI \u53ef\u80fd\u5df2\u7ecf\u6709\u503c&#xff08;\u6bd4\u5982\u5916\u5c42\u4e2d\u65ad\u5df2\u7ecf\u5c4f\u853d\u4e86\u4e00\u6279&#xff09;&#xff0c;\u9000\u51fa\u65f6\u5199 0 \u5c31\u628a\u5916\u5c42\u7684\u4e2d\u65ad\u72b6\u6001\u4e5f\u51b2\u6389\u4e86\u3002\u6240\u4ee5\u4e2d\u65ad\u7248\u5fc5\u987b&#034;\u8bb0\u4f4f\u6765\u65f6\u72b6\u6001&#xff0c;\u8d70\u65f6\u6062\u590d\u539f\u6837&#034;\u3002<\/p>\n<p>\u4e00\u53e5\u8bdd\u8bb0&#xff1a;\u975e\u4e2d\u65ad\u7248 &#061; \u9000\u51fa\u5168\u5f00&#xff1b;\u4e2d\u65ad\u7248 &#061; \u6062\u590d\u539f\u6837\u3002<\/p>\n<h4>&#xff08;7.1&#xff09; \u56db\u4e2a\u5b8f\u4e00\u8def\u5c55\u5f00\u5230\u5e95<\/h4>\n<h4>\u2460 \u975e\u4e2d\u65ad\u7248 \u00b7 \u8fdb\u5165&#xff1a;taskENTER_CRITICAL()<\/h4>\n<p>taskENTER_CRITICAL()<br \/>\n \u2192 portENTER_CRITICAL()&#xff08;\u5173\u4e2d\u65aduxCriticalNesting&#043;&#043;&#xff0c;\u5f00\u4e2d\u65aduxCriticalNesting&#8211;&#xff09;<br \/>\n \u2192 vportDISABLE_INTERRUPTS()<br \/>\n \u2192 vPortRaiseBASEPRI()<\/p>\n<p>\u6700\u5e95\u5c42&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> ulNewBASEPRI <span class=\"token operator\">&#061;<\/span> configMAX_SYSCALL_INTERRUPT_PRIORITY<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* &#061; 191 *\/<\/span><\/p>\n<p>    __asm<br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        msr basepri<span class=\"token punctuation\">,<\/span> ulNewBASEPRI    <span class=\"token comment\">\/* BASEPRI &#061; 191&#xff1a;\u5c4f\u853d\u4f18\u5148\u7ea7 \u2265 11 \u7684\u4e2d\u65ad *\/<\/span><br \/>\n        dsb<br \/>\n        isb<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u2461 \u975e\u4e2d\u65ad\u7248 \u00b7 \u9000\u51fa&#xff1a;taskEXIT_CRITICAL()<\/h4>\n<p>taskEXIT_CRITICAL()<br \/>\n \u2192 portEXIT_CRITICAL()<br \/>\n \u2192 vPortExitCritical()<br \/>\n     \u2514\u2500 \u5d4c\u5957\u8ba1\u6570\u51cf\u5230 0 \u65f6 \u2192 portENABLE_INTERRUPTS() \u2192 vPortSetBASEPRI(0)<\/p>\n<p>\u6700\u5e95\u5c42&#xff1a;<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortExitCritical<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    uxCriticalNesting<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">;<\/span>              <span class=\"token comment\">\/* \u5d4c\u5957\u8ba1\u6570\u51cf 1 *\/<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> uxCriticalNesting <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span>      <span class=\"token comment\">\/* \u6700\u5916\u5c42\u9000\u51fa\u624d\u771f\u6b63\u5f00\u4e2d\u65ad *\/<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">portENABLE_INTERRUPTS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/* &#061; vPortSetBASEPRI( 0 ) *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token class-name\">uint32_t<\/span> ulBASEPRI <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    __asm<br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        msr basepri<span class=\"token punctuation\">,<\/span> ulBASEPRI        <span class=\"token comment\">\/* BASEPRI &#061; 0&#xff1a;\u5168\u90e8\u6253\u5f00 *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u2462 \u4e2d\u65ad\u7248 \u00b7 \u8fdb\u5165&#xff1a;taskENTER_CRITICAL_FROM_ISR()<\/h4>\n<p>taskENTER_CRITICAL_FROM_ISR()<br \/>\n \u2192 portSET_INTERRUPT_MASK_FROM_ISR()<br \/>\n \u2192 ulPortRaiseBASEPRI()<\/p>\n<p>\u6700\u5e95\u5c42&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token class-name\">uint32_t<\/span> <span class=\"token function\">ulPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> ulReturn<span class=\"token punctuation\">,<\/span> ulNewBASEPRI <span class=\"token operator\">&#061;<\/span> configMAX_SYSCALL_INTERRUPT_PRIORITY<span class=\"token punctuation\">;<\/span><\/p>\n<p>    __asm<br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        mrs ulReturn<span class=\"token punctuation\">,<\/span> basepri         <span class=\"token comment\">\/* \u5148\u4fdd\u5b58\u65e7\u503c&#xff08;\u6765\u65f6\u72b6\u6001&#xff09; *\/<\/span><br \/>\n        msr basepri<span class=\"token punctuation\">,<\/span> ulNewBASEPRI     <span class=\"token comment\">\/* BASEPRI &#061; 191&#xff1a;\u5c4f\u853d \u2265 11 \u7684\u4e2d\u65ad *\/<\/span><br \/>\n        dsb<br \/>\n        isb<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> ulReturn<span class=\"token punctuation\">;<\/span>                  <span class=\"token comment\">\/* \u65e7\u503c\u4ea4\u7ed9\u8c03\u7528\u8005\u4fdd\u7ba1 *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u2463 \u4e2d\u65ad\u7248 \u00b7 \u9000\u51fa&#xff1a;taskEXIT_CRITICAL_FROM_ISR(x)<\/h4>\n<p>taskEXIT_CRITICAL_FROM_ISR( x )<br \/>\n \u2192 portCLEAR_INTERRUPT_MASK_FROM_ISR( x )<br \/>\n \u2192 vPortSetBASEPRI( x )<\/p>\n<p>\u6700\u5e95\u5c42&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> portFORCE_INLINE <span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortSetBASEPRI<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token class-name\">uint32_t<\/span> ulBASEPRI <span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/* \u5f62\u53c2 &#061; \u4e4b\u524d\u4fdd\u5b58\u7684\u65e7\u503c *\/<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    __asm<br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        msr basepri<span class=\"token punctuation\">,<\/span> ulBASEPRI        <span class=\"token comment\">\/* \u6062\u590d\u6765\u65f6\u72b6\u6001&#xff0c;\u4e0d\u662f\u5199 0 *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6700\u7ec8\u6548\u679c\u5bf9\u7167<\/p>\n<table>\n<tr>\u5b8f\u5c55\u5f00\u5230\u5e95\u5b9e\u9645\u52a8\u4f5c<\/tr>\n<tbody>\n<tr>\n<td>taskENTER_CRITICAL()<\/td>\n<td>vPortRaiseBASEPRI()<\/td>\n<td>BASEPRI \u2190 191&#xff08;\u5c4f\u853d \u226511&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>taskEXIT_CRITICAL()<\/td>\n<td>vPortExitCritical() \u2192 vPortSetBASEPRI(0)<\/td>\n<td>\u8ba1\u6570\u51cf 1&#xff0c;\u5230 0 \u65f6 BASEPRI \u2190 0&#xff08;\u5168\u5f00&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>taskENTER_CRITICAL_FROM_ISR()<\/td>\n<td>ulPortRaiseBASEPRI()<\/td>\n<td>\u5b58\u65e7\u503c \u2192 BASEPRI \u2190 191 \u2192 \u8fd4\u56de\u65e7\u503c<\/td>\n<\/tr>\n<tr>\n<td>taskEXIT_CRITICAL_FROM_ISR(x)<\/td>\n<td>vPortSetBASEPRI(x)<\/td>\n<td>BASEPRI \u2190 \u65e7\u503c&#xff08;\u6062\u590d\u539f\u6837&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u53d1\u73b0\u6ca1&#xff1a;\u7ed5\u4e86\u90a3\u4e48\u591a\u5c42\u5b8f&#xff0c;\u6700\u7ec8\u5168\u662f msr basepri \u4e00\u6761\u6307\u4ee4\u7684\u5305\u88c5\u2014\u2014\u8981\u4e48\u5199 191&#xff08;\u5173\u95e8&#xff09;&#xff0c;\u8981\u4e48\u5199 0 \u6216\u65e7\u503c&#xff08;\u5f00\u95e8&#xff09;\u3002<\/p>\n<h2>\u7a7a\u95f2\u4efb\u52a1\u4e0e\u963b\u585e\u5ef6\u65f6\u7684\u5b9e\u73b0<\/h2>\n<h3>\u524d\u8a00&#xff1a;<\/h3>\n<p>\u5728\u4e0a\u4e00\u7ae0\u8282\u4e2d&#xff0c;\u4efb\u52a1\u4f53\u5185\u7684\u5ef6\u65f6\u4f7f\u7528\u7684\u662f\u8f6f\u4ef6\u5ef6\u65f6&#xff0c;\u5373\u8fd8\u662f\u8ba9 CPU \u7a7a\u7b49\u6765\u8fbe\u5230\u5ef6\u65f6\u7684\u6548\u679c\u3002\u4f7f\u7528 RTOS \u7684\u5f88\u5927\u4f18\u52bf\u5c31\u662f\u69a8\u5e72 CPU \u7684\u6027\u80fd&#xff0c;\u6c38\u8fdc\u4e0d\u80fd\u8ba9\u5b83\u95f2\u7740&#xff0c;\u4efb\u52a1\u5982\u679c\u9700\u8981\u5ef6\u65f6\u4e5f\u5c31\u4e0d\u80fd\u518d\u8ba9 CPU \u7a7a\u7b49\u6765\u5b9e\u73b0\u5ef6\u65f6\u7684\u6548\u679c\u3002<\/p>\n<p>RTOS \u4e2d\u7684\u5ef6\u65f6\u53eb\u963b\u585e\u5ef6\u65f6&#xff0c;\u5373\u4efb\u52a1\u9700\u8981\u5ef6\u65f6\u7684\u65f6\u5019&#xff0c;\u4efb\u52a1\u4f1a\u653e\u5f03 CPU \u7684\u4f7f\u7528\u6743&#xff0c;CPU \u53ef\u4ee5\u53bb\u5e72\u5176\u5b83\u7684\u4e8b\u60c5&#xff0c;\u5f53\u4efb\u52a1\u5ef6\u65f6\u65f6\u95f4\u5230&#xff0c;\u91cd\u65b0\u83b7\u53d6 CPU \u4f7f\u7528\u6743&#xff0c;\u4efb\u52a1\u7ee7\u7eed\u8fd0\u884c&#xff0c;\u8fd9\u6837\u5c31\u5145\u5206\u5730\u5229\u7528\u4e86 CPU \u7684\u8d44\u6e90&#xff0c;\u800c\u4e0d\u662f\u5e72\u7b49\u7740\u3002<\/p>\n<p>\u5f53\u4efb\u52a1\u9700\u8981\u5ef6\u65f6&#xff0c;\u8fdb\u5165\u963b\u585e\u72b6\u6001&#xff0c;\u90a3 CPU \u53c8\u53bb\u5e72\u4ec0\u4e48\u4e8b\u60c5\u4e86&#xff1f;\u5982\u679c\u6ca1\u6709\u5176\u5b83\u4efb\u52a1\u53ef\u4ee5\u8fd0\u884c&#xff0c;RTOS \u90fd\u4f1a\u4e3a CPU \u521b\u5efa\u4e00\u4e2a\u7a7a\u95f2\u4efb\u52a1&#xff0c;\u8fd9\u4e2a\u65f6\u5019 CPU \u5c31\u8fd0\u884c\u7a7a\u95f2\u4efb\u52a1\u3002<\/p>\n<p>\u5728 FreeRTOS \u4e2d&#xff0c;\u7a7a\u95f2\u4efb\u52a1\u662f\u7cfb\u7edf\u5728\u3010\u542f\u52a8\u8c03\u5ea6\u5668\u3011\u7684\u65f6\u5019\u521b\u5efa\u7684\u4f18\u5148\u7ea7\u6700\u4f4e\u7684\u4efb\u52a1&#xff0c;\u7a7a\u95f2\u4efb\u52a1\u4e3b\u4f53\u4e3b\u8981\u662f\u505a\u4e00\u4e9b\u7cfb\u7edf\u5185\u5b58\u7684\u6e05\u7406\u5de5\u4f5c&#xff08;\u91ca\u653e\u6808\u7684\u7a7a\u95f4&#xff0c;\u540e\u9762\u5b66\u4e60\u5220\u9664\u4efb\u52a1\u7684\u65f6\u5019\u53ef\u80fd\u4f1a\u51fa\u73b0\u5220\u9664\u6808\u65e0\u6cd5\u91ca\u653e\u6808\u7a7a\u95f4&#xff0c;\u8fd9\u65f6\u7a7a\u95f2\u4efb\u52a1\u5c31\u53ef\u4ee5\u5e2e\u5fd9\u91ca\u653e\u4e86&#xff09;\u3002\u4f46\u662f\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1&#xff0c;\u6211\u4eec\u672c\u7ae0\u5b9e\u73b0\u7684\u7a7a\u95f2\u4efb\u52a1\u53ea\u662f\u5bf9\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf\u8fdb\u884c\u8ba1\u6570\u3002<\/p>\n<p>\u9274\u4e8e\u7a7a\u95f2\u4efb\u52a1\u7684\u8fd9\u79cd\u7279\u6027&#xff0c;\u5728\u5b9e\u9645\u5e94\u7528\u4e2d&#xff0c;\u5f53\u7cfb\u7edf\u8fdb\u5165\u7a7a\u95f2\u4efb\u52a1\u7684\u65f6\u5019&#xff0c;\u53ef\u5728\u7a7a\u95f2\u4efb\u52a1\u4e2d\u8ba9\u5355\u7247\u673a\u8fdb\u5165\u4f11\u7720\u6216\u8005\u4f4e\u529f\u8017\u7b49\u64cd\u4f5c\u3002<\/p>\n<h3>1.\u5b9e\u73b0\u7a7a\u95f2\u4efb\u52a1<\/h3>\n<p>\u76ee\u524d\u6211\u4eec\u5728\u521b\u5efa\u4efb\u52a1\u65f6\u4f7f\u7528\u7684\u6808\u548c TCB \u90fd\u4f7f\u7528\u7684\u662f\u9759\u6001\u7684\u5185\u5b58&#xff0c;\u5373\u9700\u8981\u9884\u5148\u5b9a\u4e49\u597d\u5185\u5b58&#xff0c;\u7a7a\u95f2\u4efb\u52a1\u4e5f\u4e0d\u4f8b\u5916\u3002\u6709\u5173\u7a7a\u95f2\u4efb\u52a1\u7684\u6808\u548c TCB \u9700\u8981\u7528\u5230\u7684\u5185\u5b58\u7a7a\u95f4\u5747\u5728 main.c \u4e2d\u5b9a\u4e49\u3002<\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1*\/<\/span><br \/>\nStackType_t IdleTaskStack<span class=\"token punctuation\">[<\/span>configMINIMAL_STACK_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u5b9a\u4e49\u4efb\u52a1\u7684TCB&#xff0c;\u7528\u6765\u63cf\u8ff0\u8be5\u4efb\u52a1\u7684\u4fe1\u606f*\/<\/span><br \/>\nTCB_t IdleTaskTCB<span class=\"token punctuation\">;<\/span><\/p>\n<p>**configMINIMAL_STACK_SIZE&#xff1a;**\u7a7a\u95f2\u4efb\u52a1\u7684\u6808\u662f\u4e00\u4e2a\u5b9a\u4e49\u597d\u7684\u6570\u7ec4&#xff0c;\u5927\u5c0f\u7531 FreeRTOSConfig.h \u4e2d\u5b9a\u4e49\u7684\u5b8f configMINIMAL_STACK_SIZE \u63a7\u5236&#xff0c;\u9ed8\u8ba4\u4e3a 128&#xff0c;\u5355\u4f4d\u4e3a\u5b57&#xff0c;\u5373 512 \u4e2a\u5b57\u8282\u3002<\/p>\n<p>**IdleTaskTCB&#xff1a;**\u4efb\u52a1\u63a7\u5236\u5757\u662f\u6bcf\u4e00\u4e2a\u4efb\u52a1\u5fc5\u987b\u7684&#xff0c;\u7a7a\u95f2\u4efb\u52a1\u7684\u7684\u4efb\u52a1\u63a7\u5236\u5757\u6211\u4eec\u5728 main.c \u4e2d\u5b9a\u4e49&#xff0c;\u662f\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf<\/p>\n<h4>&#xff08;1&#xff09;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1<\/h4>\n<p>\u5f53\u5b9a\u4e49\u597d\u7a7a\u95f2\u4efb\u52a1\u7684\u6808&#xff0c;\u4efb\u52a1\u63a7\u5236\u5757\u540e&#xff0c;\u5c31\u53ef\u4ee5\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1\u3002\u7a7a\u95f2\u4efb\u52a1\u5728\u8c03\u5ea6\u5668\u542f\u52a8\u51fd\u6570 vTaskStartScheduler()\u4e2d\u521b\u5efa&#xff1a;<\/p>\n<p><span class=\"token comment\">\/*&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1start&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;*\/<\/span><br \/>\n    TCB_t <span class=\"token operator\">*<\/span>pxIdleTaskTCBBuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>               <span class=\"token comment\">\/* \u7528\u4e8e\u6307\u5411\u7a7a\u95f2\u4efb\u52a1\u63a7\u5236\u5757 *\/<\/span><br \/>\n    StackType_t <span class=\"token operator\">*<\/span>pxIdleTaskStackBuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/* \u7528\u4e8e\u7a7a\u95f2\u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> ulIdleTaskStackSize<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u83b7\u53d6\u7a7a\u95f2\u4efb\u52a1\u7684\u5185\u5b58&#xff1a;\u4efb\u52a1\u6808\u548c\u4efb\u52a1TCB *\/<\/span><br \/>\n    <span class=\"token function\">vApplicationGetIdleTaskMemory<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span>pxIdleTaskTCBBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                   <span class=\"token operator\">&amp;<\/span>pxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                   <span class=\"token operator\">&amp;<\/span>ulIdleTaskStackSize <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <\/p>\n<p>    xIdleTaskHandle <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">xTaskCreateStatic<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span>TaskFunction_t<span class=\"token punctuation\">)<\/span>prvIdleTask<span class=\"token punctuation\">,<\/span>              <span class=\"token comment\">\/* \u4efb\u52a1\u5165\u53e3 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token string\">&#034;IDLE&#034;<\/span><span class=\"token punctuation\">,<\/span>                           <span class=\"token comment\">\/* \u4efb\u52a1\u540d\u79f0&#xff0c;\u5b57\u7b26\u4e32\u5f62\u5f0f *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span><span class=\"token punctuation\">)<\/span>ulIdleTaskStackSize <span class=\"token punctuation\">,<\/span>           <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u5927\u5c0f&#xff0c;\u5355\u4f4d\u4e3a\u5b57 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span>                            <span class=\"token comment\">\/* \u4efb\u52a1\u5f62\u53c2 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span>StackType_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span>     <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span>TCB_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskTCBBuffer <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/* \u4efb\u52a1\u63a7\u5236\u5757 *\/<\/span><br \/>\n    <span class=\"token comment\">\/* \u5c06\u4efb\u52a1\u6dfb\u52a0\u5230\u5c31\u7eea\u5217\u8868 *\/<\/span><br \/>\n    <span class=\"token function\">vListInsertEnd<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> pxReadyTasksLists<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>TCB_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskTCBBuffer<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>xStateListItem <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1end&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;*\/<\/span><\/p>\n<p>\u6211\u4eec\u5148\u524d\u5728main.c\u5b9a\u4e49\u4e86\u7a7a\u95f2\u4efb\u52a1\u7684\u6808\u3001TCB\u8fd9\u4e9b\u4fe1\u606f&#xff0c;\u4f46\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1\u662f\u5728task.c\u521b\u5efa\u7684&#xff0c;\u6240\u4ee5\u83b7 \u53d6 \u7a7a \u95f2 \u4efb \u52a1 \u7684 \u5185 \u5b58 &#xff0c; \u5373 \u5c06 pxIdleTaskTCBBuffer \u548cpxIdleTaskStackBuffer \u8fd9\u4e24\u4e2a\u63a5\u4e0b\u6765\u8981\u4f5c\u4e3a\u5f62\u53c2\u4f20\u5230 xTaskCreateStatic()\u51fd\u6570\u7684\u6307\u9488\u5206\u522b\u6307\u5411\u7a7a\u95f2\u4efb\u52a1\u7684 TCB \u548c\u6808\u7684\u8d77\u59cb\u5730\u5740&#xff0c;\u8fd9\u4e2a\u64cd\u4f5c\u7531\u4e8c\u7ea7\u6307\u9488\u51fd\u6570 vApplicationGetIdleTaskMemory()\u6765\u5b9e\u73b0&#xff1a;<\/p>\n<p>main.c<\/p>\n<p><span class=\"token comment\">\/*\u4e8c\u7ea7\u6307\u9488\u51fd\u6570&#xff0c;\u53c2\u6570\u662f\u4e8c\u7ea7\u6307\u9488&#xff0c;\u6307\u5411\u4e00\u7ea7\u6307\u9488*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vApplicationGetIdleTaskMemory<\/span><span class=\"token punctuation\">(<\/span> TCB_t <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ppxIdleTaskTCBBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                    StackType_t <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ppxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                    <span class=\"token class-name\">uint32_t<\/span> <span class=\"token operator\">*<\/span>pulIdleTaskStackSize <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token operator\">*<\/span>ppxIdleTaskTCBBuffer<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">*<\/span>ppxIdleTaskStackBuffer<span class=\"token operator\">&#061;<\/span>IdleTaskStack<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">*<\/span>pulIdleTaskStackSize<span class=\"token operator\">&#061;<\/span>configMINIMAL_STACK_SIZE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>task.c&#xff1a;<\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1*\/<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> StackType_t IdleTaskStack<span class=\"token punctuation\">[<\/span>configMINIMAL_STACK_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> TCB_t IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u4e8c\u7ea7\u6307\u9488\u51fd\u6570&#xff0c;\u53c2\u6570\u662f\u4e8c\u7ea7\u6307\u9488&#xff0c;\u6307\u5411\u4e00\u7ea7\u6307\u9488*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vApplicationGetIdleTaskMemory<\/span><span class=\"token punctuation\">(<\/span> TCB_t <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ppxIdleTaskTCBBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                    StackType_t <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ppxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                    <span class=\"token class-name\">uint32_t<\/span> <span class=\"token operator\">*<\/span>pulIdleTaskStackSize <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token operator\">*<\/span>ppxIdleTaskTCBBuffer<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">*<\/span>ppxIdleTaskStackBuffer<span class=\"token operator\">&#061;<\/span>IdleTaskStack<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">*<\/span>pulIdleTaskStackSize<span class=\"token operator\">&#061;<\/span>configMINIMAL_STACK_SIZE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1start&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;*\/<\/span><br \/>\n    TCB_t <span class=\"token operator\">*<\/span>pxIdleTaskTCBBuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>               <span class=\"token comment\">\/* \u7528\u4e8e\u6307\u5411\u7a7a\u95f2\u4efb\u52a1\u63a7\u5236\u5757 *\/<\/span><br \/>\n    StackType_t <span class=\"token operator\">*<\/span>pxIdleTaskStackBuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/* \u7528\u4e8e\u7a7a\u95f2\u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> ulIdleTaskStackSize<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u83b7\u53d6\u7a7a\u95f2\u4efb\u52a1\u7684\u5185\u5b58&#xff1a;\u4efb\u52a1\u6808\u548c\u4efb\u52a1TCB *\/<\/span><br \/>\n    <span class=\"token function\">vApplicationGetIdleTaskMemory<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span>pxIdleTaskTCBBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                   <span class=\"token operator\">&amp;<\/span>pxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                   <span class=\"token operator\">&amp;<\/span>ulIdleTaskStackSize <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <\/p>\n<p>    xIdleTaskHandle <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">xTaskCreateStatic<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span>TaskFunction_t<span class=\"token punctuation\">)<\/span>prvIdleTask<span class=\"token punctuation\">,<\/span>              <span class=\"token comment\">\/* \u4efb\u52a1\u5165\u53e3 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token string\">&#034;IDLE&#034;<\/span><span class=\"token punctuation\">,<\/span>                           <span class=\"token comment\">\/* \u4efb\u52a1\u540d\u79f0&#xff0c;\u5b57\u7b26\u4e32\u5f62\u5f0f *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span><span class=\"token punctuation\">)<\/span>ulIdleTaskStackSize <span class=\"token punctuation\">,<\/span>           <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u5927\u5c0f&#xff0c;\u5355\u4f4d\u4e3a\u5b57 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span>                            <span class=\"token comment\">\/* \u4efb\u52a1\u5f62\u53c2 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span>StackType_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span>     <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span>TCB_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskTCBBuffer <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/* \u4efb\u52a1\u63a7\u5236\u5757 *\/<\/span><br \/>\n    <span class=\"token comment\">\/* \u5c06\u4efb\u52a1\u6dfb\u52a0\u5230\u5c31\u7eea\u5217\u8868 *\/<\/span><br \/>\n    <span class=\"token function\">vListInsertEnd<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> pxReadyTasksLists<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>TCB_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskTCBBuffer<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>xStateListItem <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1end&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;*\/<\/span><\/p>\n<p>\u6211\u4eec\u628a\u6574\u5957\u673a\u5236\u7c7b\u6bd4\u6210\u5c0f\u533a\u7269\u4e1a\u7684\u94a5\u5319\u9886\u53d6\u7a97\u53e3&#xff1a;<\/p>\n<li>IdleTaskTCB\u3001IdileTaskStack\u3001\u6808\u5927\u5c0f\u6570\u503c \u2192 \u5c0f\u533a\u91cc\u4e09\u95f4\u56fa\u5b9a\u7684\u5e93\u623f&#xff08;\u5206\u522b\u5b58\u653e\u4efb\u52a1\u63a7\u5236\u5757\u3001\u4efb\u52a1\u6808\u3001\u6807\u6ce8\u6808\u5bb9\u91cf&#xff09;&#xff0c;\u4f4d\u7f6e\u6c38\u8fdc\u4e0d\u53d8\u3002<\/li>\n<li>\u51fd\u6570\u91cc\u7684 &amp;IdleTaskTCB\u3001IdleTaskStack \u8fd9\u4e9b\u5730\u5740 \u2192 \u5bf9\u5e94\u5e93\u623f\u7684\u552f\u4e00\u94a5\u5319&#xff0c;\u62ff\u7740\u5b83\u5c31\u80fd\u627e\u5230\u5bf9\u5e94\u7684\u5185\u5b58\u3002<\/li>\n<li>\u51fd\u6570\u7684\u4e09\u4e2a\u53c2\u6570&#xff08;ppxIdleTaskTCBBuffer \u7b49&#xff09;\u2192 \u662f\u6765\u9886\u94a5\u5319\u7684\u4eba&#xff08;\u5185\u6838&#xff09;\u9012\u8fc7\u6765\u7684\u7a7a\u4fe1\u5c01\u3002\n<ul>\n<li>\u524d\u4e24\u4e2a\u4fe1\u5c01\u662f\u4e13\u95e8\u7528\u6765\u88c5 \u201c\u94a5\u5319\u201d \u7684&#xff08;\u5bf9\u5e94\u4e8c\u7ea7\u6307\u9488&#xff1a;\u56e0\u4e3a\u8981\u8fd4\u56de\u7684\u672c\u8eab\u5c31\u662f\u4e00\u4e2a\u6307\u9488 \/ \u5730\u5740&#xff09;&#xff1b;<\/li>\n<li>\u7b2c\u4e09\u4e2a\u4fe1\u5c01\u662f\u7528\u6765\u88c5 \u201c\u5e93\u623f\u9762\u79ef\u6570\u5b57\u201d \u7684&#xff08;\u5bf9\u5e94\u4e00\u7ea7\u6307\u9488&#xff1a;\u8fd4\u56de\u666e\u901a\u6570\u503c&#xff09;\u3002<\/li>\n<\/ul>\n<\/li>\n<li>vApplicationGetIdleTaskMemory \u51fd\u6570\u672c\u8eab \u2192 \u5c31\u662f\u8fd9\u4e2a\u56fa\u5b9a\u7684\u53d1\u653e\u7a97\u53e3\u3002\n<ul>\n<li>\u4e0d\u7ba1\u8c01\u6765\u3001\u9012\u8fc7\u6765\u4ec0\u4e48\u6837\u7684\u7a7a\u4fe1\u5c01&#xff0c;\u7a97\u53e3\u90fd\u4f1a\u628a\u56fa\u5b9a\u7684\u90a3\u4e09\u628a\u94a5\u5319 \/ \u6570\u5b57\u88c5\u8fdb\u4fe1\u5c01\u91cc&#xff1b;<\/li>\n<li>\u6240\u4ee5\u6240\u6709\u4eba\u9886\u56de\u53bb\u7684&#xff0c;\u6307\u5411\u7684\u90fd\u662f\u540c\u4e00\u6279\u5e93\u623f&#xff0c;\u62ff\u5230\u7684\u4fe1\u606f\u5b8c\u5168\u4e00\u81f4\u3002<\/li>\n<\/ul>\n<\/li>\n<ul>\n<li>*ppxIdleTaskTCBBuffer &#061; &amp;IdleTaskTCB; \u2192 \u628a TCB \u5e93\u623f\u7684\u94a5\u5319&#xff0c;\u585e\u8fdb\u5185\u6838\u9012\u6765\u7684\u7b2c\u4e00\u4e2a\u4fe1\u5c01\u91cc<\/li>\n<li>*ppxIdleTaskStackBuffer &#061; IdleTaskStack; \u2192 \u628a\u6808\u5e93\u623f\u7684\u94a5\u5319&#xff0c;\u585e\u8fdb\u5185\u6838\u9012\u6765\u7684\u7b2c\u4e8c\u4e2a\u4fe1\u5c01\u91cc<\/li>\n<li>*pulIdleTaskStackSize &#061; configMINIMAL_STACK_SIZE; \u2192 \u628a\u6808\u9762\u79ef\u6570\u5b57&#xff0c;\u585e\u8fdb\u7b2c\u4e09\u4e2a\u4fe1\u5c01\u91cc<\/li>\n<\/ul>\n<p>\u4e00\u53e5\u8bdd\u603b\u7ed3&#xff1a;\u7a97\u53e3\u662f\u56fa\u5b9a\u7684&#xff0c;\u5e93\u623f\u662f\u56fa\u5b9a\u7684&#xff0c;\u94a5\u5319\u4e5f\u662f\u56fa\u5b9a\u7684\u2014\u2014\u53d8\u7684\u53ea\u662f\u6765\u9886\u94a5\u5319\u7684\u4eba&#xff08;\u5185\u6838&#xff09;\u9012\u8fc7\u6765\u7684\u4fe1\u5c01\u3002 \u6240\u4ee5\u4e0d\u7ba1\u5185\u6838\u600e\u4e48\u8c03\u7528&#xff0c;\u62ff\u56de\u53bb\u7684\u6c38\u8fdc\u662f\u540c\u4e00\u6279\u5185\u5b58\u7684\u5730\u5740&#xff0c;\u8fd9\u5c31\u662f vApplicationGetIdleTaskMemory() \u7528\u4e8c\u7ea7\u6307\u9488\u628a\u300c\u5185\u5b58\u5730\u5740\u300d\u88c5\u8fdb\u300c\u53c2\u6570\u4fe1\u5c01\u300d\u8fd4\u56de\u7ed9\u5185\u6838\u7684\u5168\u90e8\u79d8\u5bc6\u3002<\/p>\n<p>\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1\u5165\u53e3&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">portTASK_FUNCTION<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> vFunction<span class=\"token punctuation\">,<\/span> pvParameters <span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">vFunction<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>pvParameters <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1*\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token function\">portTASK_FUNCTION<\/span><span class=\"token punctuation\">(<\/span> prvIdleTask<span class=\"token punctuation\">,<\/span> pvParameters <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* \u9632\u6b62\u7f16\u8bd1\u5668\u7684\u8b66\u544a *\/<\/span><br \/>\n<span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span> pvParameters<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/* \u7a7a\u95f2\u4efb\u52a1\u6682\u65f6\u4ec0\u4e48\u90fd\u4e0d\u505a *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6700\u540e\u5c06\u7a7a\u95f2\u4efb\u52a1\u63d2\u5165\u5230\u5c31\u7eea\u5217\u8868\u7684\u5f00\u5934\u3002\u5728\u4e0b\u4e00\u7ae0\u6211\u4eec\u4f1a\u652f\u6301\u4f18\u5148\u7ea7&#xff0c;\u7a7a\u95f2\u4efb\u52a1\u9ed8\u8ba4\u7684\u4f18\u5148\u7ea7\u662f\u6700\u4f4e\u7684&#xff0c;\u5373\u6392\u5728\u5c31\u7eea\u5217\u8868\u7684\u5f00\u5934\u3002<\/p>\n<h4>2.\u5b9e\u73b0\u963b\u585e\u5ef6\u65f6<\/h4>\n<h4>&#xff08;1&#xff09;vTaskDelay ()\u51fd\u6570<\/h4>\n<p>\u963b\u585e\u5ef6\u65f6\u7684\u963b\u585e\u662f\u6307\u4efb\u52a1\u8c03\u7528\u8be5\u5ef6\u65f6\u51fd\u6570\u540e&#xff0c;\u4efb\u52a1\u4f1a\u88ab\u5265\u79bb CPU \u4f7f\u7528\u6743&#xff0c;\u7136\u540e\u8fdb\u5165\u963b\u585e\u72b6\u6001&#xff0c;\u76f4\u5230\u5ef6\u65f6\u7ed3\u675f&#xff0c;\u4efb\u52a1\u91cd\u65b0\u83b7\u53d6 CPU \u4f7f\u7528\u6743\u624d\u53ef\u4ee5\u7ee7\u7eed\u8fd0\u884c\u3002\u5728\u4efb\u52a1\u963b\u585e\u7684\u8fd9\u6bb5\u65f6\u95f4&#xff0c;CPU \u53ef\u4ee5\u53bb\u6267\u884c\u5176\u5b83\u7684\u4efb\u52a1&#xff0c;\u5982\u679c\u5176\u5b83\u7684\u4efb\u52a1\u4e5f\u5728\u5ef6\u65f6\u72b6\u6001&#xff0c;\u90a3\u4e48 CPU \u5c31\u5c06\u8fd0\u884c\u7a7a\u95f2\u4efb\u52a1\u3002\u963b\u585e\u5ef6\u65f6\u51fd\u6570\u5728 task.c \u4e2d\u5b9a\u4e49&#xff1a;<\/p>\n<p><span class=\"token comment\">\/*\u4efb\u52a1\u963b\u585e\u51fd\u6570*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vTaskDelay<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">const<\/span> TickType_t xTicksToDelay <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    TCB_t <span class=\"token operator\">*<\/span>pxTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u83b7\u53d6\u5f53\u524d\u4efb\u52a1\u7684TCB *\/<\/span><br \/>\n    pxTCB <span class=\"token operator\">&#061;<\/span> pxCurrentTCB<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u8bbe\u7f6e\u5ef6\u65f6\u65f6\u95f4 *\/<\/span><br \/>\n    pxTCB<span class=\"token operator\">-&gt;<\/span>xTicksToDelay <span class=\"token operator\">&#061;<\/span> xTicksToDelay<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u4efb\u52a1\u5207\u6362 *\/<\/span><br \/>\n    <span class=\"token function\">taskYIELD<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>pxTCB &#061; pxCurrentTCB&#xff1a; \u53d6\u5f53\u524d\u4efb\u52a1\u7684\u4efb\u52a1\u63a7\u5236\u5757\u3002pxCurrentTCB \u662f\u4e00\u4e2a\u5728 task.c \u5b9a\u4e49\u7684\u5168\u5c40\u6307\u9488&#xff0c;\u7528\u4e8e\u6307\u5411\u5f53\u524d\u6b63\u5728\u8fd0\u884c\u6216\u8005\u5373\u5c06\u8981\u8fd0\u884c\u7684\u4efb\u52a1\u7684\u4efb\u52a1\u63a7\u5236\u5757\u3002<\/p>\n<p>pxTCB-&gt;xTicksToDelay &#061; xTicksToDelay&#xff1a; xTicksToDelay \u662f\u4efb\u52a1\u63a7\u5236\u5757\u7684\u4e00\u4e2a\u6210\u5458&#xff0c;\u7528\u4e8e\u8bb0\u5f55\u4efb\u52a1\u9700\u8981\u5ef6\u65f6\u7684\u65f6\u95f4&#xff0c;\u5355\u4f4d\u4e3a SysTick \u7684\u4e2d\u65ad\u5468\u671f\u3002\u6bd4\u5982\u6211\u4eec\u672c\u4e66\u5f53\u4e2d SysTick \u7684\u4e2d\u65ad\u5468\u671f\u4e3a 10ms&#xff0c;\u8c03\u7528 vTaskDelay( 2 )\u5219\u5b8c\u6210 2*10ms \u7684\u5ef6\u65f6\u3002<\/p>\n<p>\u4e4b\u524d\u7684TCB\u7ed3\u6784\u4f53\u662f\u6ca1\u6709xTicksToDelay\u8fd9\u4e2a\u6210\u5458\u7684&#xff0c;\u6240\u4ee5\u6211\u4eec\u8981\u4fee\u6539TCB\u7ed3\u6784\u4f53&#xff1a;<\/p>\n<p><span class=\"token comment\">\/*StackType_t\u5c31\u662fuint32_t*\/<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">tskTaskControlBlock<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">volatile<\/span> StackType_t    <span class=\"token operator\">*<\/span>pxTopOfStack<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u6808\u9876 *\/<\/span><\/p>\n<p>ListItem_t    xStateListItem<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* \u4efb\u52a1\u8282\u70b9 *\/<\/span><\/p>\n<p>    StackType_t             <span class=\"token operator\">*<\/span>pxStack<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n                                          <span class=\"token comment\">\/* \u4efb\u52a1\u540d\u79f0&#xff0c;\u5b57\u7b26\u4e32\u5f62\u5f0f *\/<\/span><br \/>\n<span class=\"token keyword\">char<\/span>                    pcTaskName<span class=\"token punctuation\">[<\/span> configMAX_TASK_NAME_LEN <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    TickType_t xTicksToDelay<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u7528\u4e8e\u5ef6\u65f6 *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> tskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> tskTCB TCB_t<span class=\"token punctuation\">;<\/span><\/p>\n<p>taskYIELD()&#xff1a; \u4efb\u52a1\u5207\u6362\u3002\u8c03\u7528 tashYIELD()\u4f1a\u4ea7\u751f PendSV\u4e2d\u65ad&#xff0c;\u5728 PendSV\u4e2d\u65ad\u670d\u52a1\u51fd\u6570\u4e2d\u4f1a\u8c03\u7528\u4e0a\u4e0b\u6587\u5207\u6362\u51fd\u6570 vTaskSwitchContext()&#xff0c;\u8be5\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5bfb\u627e\u6700\u9ad8\u4f18\u5148\u7ea7\u7684\u5c31\u7eea\u4efb\u52a1&#xff0c;\u7136\u540e\u66f4\u65b0 pxCurrentTCB\u3002\u4e0a\u4e00\u7ae0\u6211\u4eec\u53ea\u6709\u4e24\u4e2a\u4efb\u52a1&#xff0c;\u5219 pxCurrentTCB \u4e0d\u662f\u6307\u5411\u4efb\u52a1 1 \u5c31\u662f\u6307\u5411\u4efb\u52a1 2&#xff0c;\u672c\u7ae0\u8282\u5f00\u59cb\u6211\u4eec\u591a\u589e\u52a0\u4e86\u4e00\u4e2a\u7a7a\u95f2\u4efb\u52a1&#xff0c;\u5219\u9700\u8981\u8ba9pxCurrentTCB \u5728\u8fd9\u4e09\u4e2a\u4efb\u52a1\u4e2d\u5207\u6362&#xff0c;\u7b97\u6cd5\u9700\u8981\u6539\u53d8<\/p>\n<h4>&#xff08;2&#xff09;\u4fee\u6539 vTaskSwitchContext()\u51fd\u6570<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\"><span class=\"token number\">0<\/span><\/span><\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vTaskSwitchContext<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> pxCurrentTCB <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Task1TCB <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        pxCurrentTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Task2TCB<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        pxCurrentTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">else<\/span><\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">vTaskSwitchContext<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* \u5982\u679c\u5f53\u524d\u7ebf\u7a0b\u662f\u7a7a\u95f2\u7ebf\u7a0b&#xff0c;\u90a3\u4e48\u5c31\u53bb\u5c1d\u8bd5\u6267\u884c\u7ebf\u7a0b1\u6216\u8005\u7ebf\u7a0b2&#xff0c;<br \/>\n       \u770b\u770b\u4ed6\u4eec\u7684\u5ef6\u65f6\u65f6\u95f4\u662f\u5426\u7ed3\u675f&#xff0c;\u5982\u679c\u7ebf\u7a0b\u7684\u5ef6\u65f6\u65f6\u95f4\u5747\u6ca1\u6709\u5230\u671f&#xff0c;<br \/>\n       \u90a3\u5c31\u8fd4\u56de\u7ee7\u7eed\u6267\u884c\u7a7a\u95f2\u7ebf\u7a0b *\/<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> pxCurrentTCB <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&amp;<\/span>IdleTaskTCB <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>Task1TCB<span class=\"token punctuation\">.<\/span>xTicksToDelay <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n            pxCurrentTCB <span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>Task2TCB<span class=\"token punctuation\">.<\/span>xTicksToDelay <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n            pxCurrentTCB <span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>Task2TCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/* \u7ebf\u7a0b\u5ef6\u65f6\u5747\u6ca1\u6709\u5230\u671f\u5219\u8fd4\u56de&#xff0c;\u7ee7\u7eed\u6267\u884c\u7a7a\u95f2\u7ebf\u7a0b *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/*\u5982\u679c\u5f53\u524d\u7ebf\u7a0b\u662f\u7ebf\u7a0b1\u6216\u8005\u7ebf\u7a0b2\u7684\u8bdd&#xff0c;\u68c0\u67e5\u4e0b\u53e6\u5916\u4e00\u4e2a\u7ebf\u7a0b,\u5982\u679c\u53e6\u5916\u7684\u7ebf\u7a0b\u4e0d\u5728\u5ef6\u65f6\u4e2d&#xff0c;\u5c31\u5207\u6362\u5230\u8be5\u7ebf\u7a0b<br \/>\n        \u5426\u5219&#xff0c;\u5224\u65ad\u4e0b\u5f53\u524d\u7ebf\u7a0b\u662f\u5426\u5e94\u8be5\u8fdb\u5165\u5ef6\u65f6\u72b6\u6001&#xff0c;\u5982\u679c\u662f\u7684\u8bdd&#xff0c;\u5c31\u5207\u6362\u5230\u7a7a\u95f2\u7ebf\u7a0b\u3002\u5426\u5219\u5c31\u4e0d\u8fdb\u884c\u4efb\u4f55\u5207\u6362 *\/<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pxCurrentTCB <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/*\u5982\u679c\u4efb\u52a1\u4e0d\u5904\u4e8e\u963b\u585e\u72b6\u6001\u5c31\u5207\u6362\u4efb\u52a1\u4e8c*\/<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>Task2TCB<span class=\"token punctuation\">.<\/span>xTicksToDelay <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n                pxCurrentTCB <span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>Task2TCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/*\u5982\u679c\u5f53\u524d\u4efb\u52a1\u5904\u4e8e\u963b\u585e\u72b6\u6001&#xff0c;\u5c31\u8fdb\u5165\u7a7a\u95f2\u4efb\u52a1*\/<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pxCurrentTCB<span class=\"token operator\">-&gt;<\/span>xTicksToDelay <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n                pxCurrentTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/* \u8fd4\u56de&#xff0c;\u4e0d\u8fdb\u884c\u5207\u6362&#xff0c;\u56e0\u4e3a\u4e24\u4e2a\u7ebf\u7a0b\u90fd\u5904\u4e8e\u5ef6\u65f6\u4e2d *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pxCurrentTCB <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Task2TCB<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>Task1TCB<span class=\"token punctuation\">.<\/span>xTicksToDelay <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n                pxCurrentTCB <span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pxCurrentTCB<span class=\"token operator\">-&gt;<\/span>xTicksToDelay <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n                pxCurrentTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/* \u8fd4\u56de&#xff0c;\u4e0d\u8fdb\u884c\u5207\u6362&#xff0c;\u56e0\u4e3a\u4e24\u4e2a\u7ebf\u7a0b\u90fd\u5904\u4e8e\u5ef6\u65f6\u4e2d *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>if( pxCurrentTCB &#061;&#061; &amp;IdleTaskTCB )&#xff1a; \u5982\u679c\u5f53\u524d\u4efb\u52a1\u662f\u7a7a\u95f2\u4efb\u52a1&#xff0c;\u90a3\u4e48\u5c31\u53bb\u5c1d\u8bd5\u6267\u884c\u4efb\u52a1 1 \u6216\u8005\u4efb\u52a1 2&#xff0c;\u770b\u770b\u4ed6\u4eec\u7684\u5ef6\u65f6\u65f6\u95f4\u662f\u5426\u7ed3\u675f&#xff0c;\u5982\u679c\u4efb\u52a1\u7684\u5ef6\u65f6\u65f6\u95f4\u5747\u6ca1\u6709\u5230\u671f&#xff0c;\u90a3\u5c31\u8fd4\u56de\u7ee7\u7eed\u6267\u884c\u7a7a\u95f2\u4efb\u52a1\u3002<\/p>\n<p>else&#xff1a; \u5982\u679c\u5f53\u524d\u4efb\u52a1\u662f\u4efb\u52a1 1 \u6216\u8005\u4efb\u52a1 2 \u7684\u8bdd&#xff0c;\u68c0\u67e5\u4e0b\u53e6\u5916\u4e00\u4e2a\u4efb\u52a1&#xff0c;\u5982\u679c\u53e6\u5916\u7684\u4efb\u52a1\u4e0d\u5728\u5ef6\u65f6\u4e2d&#xff0c;\u5c31\u5207\u6362\u5230\u8be5\u4efb\u52a1\u3002\u5426\u5219&#xff0c;\u5224\u65ad\u4e0b\u5f53\u524d\u4efb\u52a1\u662f\u5426\u5e94\u8be5\u8fdb\u5165\u5ef6\u65f6\u72b6\u6001&#xff0c;\u5982\u679c\u662f\u7684\u8bdd&#xff0c;\u5c31\u5207\u6362\u5230\u7a7a\u95f2\u4efb\u52a1&#xff0c;\u5426\u5219\u5c31\u4e0d\u8fdb\u884c\u4efb\u4f55\u5207\u6362 \u3002<\/p>\n<h4>&#xff08;3&#xff09;SysTick \u4e2d\u65ad\u670d\u52a1\u51fd\u6570<\/h4>\n<p>\u5728\u4efb\u52a1\u4e0a\u4e0b\u6587\u5207\u6362\u51fd\u6570 vTaskSwitchContext ()\u4e2d&#xff0c;\u4f1a\u5224\u65ad\u6bcf\u4e2a\u4efb\u52a1\u7684\u4efb\u52a1\u63a7\u5236\u5757\u4e2d\u7684\u5ef6\u65f6\u6210\u5458 xTicksToDelay \u7684\u503c\u662f\u5426\u4e3a 0&#xff0c;\u5982\u679c\u4e3a 0\u5c31\u8981\u5c06\u5bf9\u5e94\u7684\u4efb\u52a1\u5c31\u7eea&#xff0c;\u5982\u679c\u4e0d\u4e3a 0 \u5c31\u7ee7\u7eed\u5ef6\u65f6\u3002\u5982\u679c\u4e00\u4e2a\u4efb\u52a1\u8981\u5ef6\u65f6&#xff0c;\u4e00\u5f00\u59cb xTicksToDelay \u80af\u5b9a\u4e0d\u4e3a 0&#xff0c;\u5f53 xTicksToDelay \u53d8\u4e3a0 \u7684\u65f6\u5019\u8868\u793a\u5ef6\u65f6\u7ed3\u675f&#xff0c;\u90a3\u4e48 xTicksToDelay \u662f\u4ee5\u4ec0\u4e48\u5468\u671f\u5728\u9012\u51cf&#xff1f;\u5728\u54ea\u91cc\u9012\u51cf&#xff1f;\u5728FreeRTOS \u4e2d&#xff0c;\u8fd9\u4e2a\u5468\u671f\u7531 SysTick \u4e2d\u65ad\u63d0\u4f9b&#xff0c;\u64cd\u4f5c\u7cfb\u7edf\u91cc\u9762\u7684\u6700\u5c0f\u7684\u65f6\u95f4\u5355\u4f4d\u5c31\u662fSysTick \u7684\u4e2d\u65ad\u5468\u671f&#xff0c;\u6211\u4eec\u79f0\u4e4b\u4e3a\u4e00\u4e2a tick&#xff0c;SysTick \u4e2d\u65ad\u670d\u52a1\u51fd\u6570\u5728 port.c.c \u4e2d\u5b9e\u73b0<\/p>\n<p><span class=\"token comment\">\/*<br \/>\n*************************************************************************<br \/>\n*                             SysTick\u4e2d\u65ad\u670d\u52a1\u51fd\u6570<br \/>\n*************************************************************************<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">xPortSysTickHandler<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* \u5173\u4e2d\u65ad *\/<\/span><br \/>\n    <span class=\"token function\">vPortRaiseBASEPRI<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u66f4\u65b0\u7cfb\u7edf\u65f6\u57fa *\/<\/span><br \/>\n    <span class=\"token function\">xTaskIncrementTick<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5f00\u4e2d\u65ad *\/<\/span><br \/>\n    <span class=\"token function\">vPortClearBASEPRIFromISR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4ece\u524d\u9762\u7684\u5b66\u4e60\u6211\u4eec\u53eaSysTick\u4e2d\u65ad\u662f\u4f18\u5148\u7ea7\u6700\u4f4e\u7684\u4e2d\u65ad&#xff0c;\u6240\u4ee5\u4e3a\u4e86\u9632\u6b62SysTick\u4e2d\u65ad\u6267\u884c\u5230\u4e00\u534a\u88ab\u5176\u5b83\u4f18\u5148\u7ea7\u66f4\u9ad8\u7684\u4e2d\u65ad\u6253\u65ad&#xff0c;\u6240\u4ee5\u6211\u4eec\u8981\u5728\u6267\u884c<br \/>\n\u66f4\u65b0\u7cfb\u7edf\u65f6\u57fa\u4e4b\u524d\u5173\u95ed\u4e2d\u65ad<\/p>\n<h4>&#xff08;4&#xff09;xTaskIncrementTick()\u51fd\u6570&#xff1a;<\/h4>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">volatile<\/span> TickType_t xTickCount <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span> TickType_t <span class=\"token punctuation\">)<\/span> <span class=\"token number\">0U<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">xTaskIncrementTick<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    TCB_t <span class=\"token operator\">*<\/span>pxTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    BaseType_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u66f4\u65b0\u7cfb\u7edf\u65f6\u57fa\u8ba1\u6570\u5668xTickCount&#xff0c;xTickCount\u662f\u4e00\u4e2a\u5728task.c\u4e2d\u5b9a\u4e49\u7684\u5168\u5c40\u53d8\u91cf *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> TickType_t xConstTickCount <span class=\"token operator\">&#061;<\/span> xTickCount <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    xTickCount <span class=\"token operator\">&#061;<\/span> xConstTickCount<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u626b\u63cf\u5c31\u7eea\u5217\u8868\u4e2d\u6240\u6709\u7ebf\u7a0b\u7684xTicksToDelay&#xff0c;\u5982\u679c\u4e0d\u4e3a0&#xff0c;\u5219\u51cf1 *\/<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&lt;<\/span>configMAX_PRIORITIES<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n        pxTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span> TCB_t <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token function\">listGET_OWNER_OF_HEAD_ENTRY<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span>pxReadyTasksLists<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pxTCB<span class=\"token operator\">-&gt;<\/span>xTicksToDelay <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\npxTCB<span class=\"token operator\">-&gt;<\/span>xTicksToDelay <span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u4efb\u52a1\u5207\u6362 *\/<\/span><br \/>\n    <span class=\"token function\">portYIELD<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>&#xff08;1&#xff09;const TickType_t xConstTickCount &#061; xTickCount &#043; 1&#xff1a; \u66f4\u65b0\u7cfb\u7edf\u65f6\u57fa\u8ba1\u6570\u5668 xTickCount&#xff0c;\u52a0\u4e00\u64cd\u4f5c\u3002xTickCount \u662f\u4e00\u4e2a\u5728<br \/>\nport.c \u4e2d\u5b9a\u4e49\u7684\u5168\u5c40\u53d8\u91cf&#xff0c;\u5728\u51fd\u6570 vTaskStartScheduler()\u4e2d\u8c03\u7528 xPortStartScheduler()\u51fd\u6570\u524d\u521d\u59cb\u5316\u3002\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token comment\">\/*\u5f00\u542f\u4efb\u52a1\u8c03\u5ea6*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vTaskStartScheduler<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/*&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1start&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;*\/<\/span><br \/>\n    TCB_t <span class=\"token operator\">*<\/span>pxIdleTaskTCBBuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>               <span class=\"token comment\">\/* \u7528\u4e8e\u6307\u5411\u7a7a\u95f2\u4efb\u52a1\u63a7\u5236\u5757 *\/<\/span><br \/>\n    StackType_t <span class=\"token operator\">*<\/span>pxIdleTaskStackBuffer <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/* \u7528\u4e8e\u7a7a\u95f2\u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> ulIdleTaskStackSize<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u83b7\u53d6\u7a7a\u95f2\u4efb\u52a1\u7684\u5185\u5b58&#xff1a;\u4efb\u52a1\u6808\u548c\u4efb\u52a1TCB *\/<\/span><br \/>\n    <span class=\"token function\">vApplicationGetIdleTaskMemory<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span>pxIdleTaskTCBBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                   <span class=\"token operator\">&amp;<\/span>pxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                   <span class=\"token operator\">&amp;<\/span>ulIdleTaskStackSize <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <\/p>\n<p>    xIdleTaskHandle <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">xTaskCreateStatic<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span>TaskFunction_t<span class=\"token punctuation\">)<\/span>prvIdleTask<span class=\"token punctuation\">,<\/span>              <span class=\"token comment\">\/* \u4efb\u52a1\u5165\u53e3 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token string\">&#034;IDLE&#034;<\/span><span class=\"token punctuation\">,<\/span>                           <span class=\"token comment\">\/* \u4efb\u52a1\u540d\u79f0&#xff0c;\u5b57\u7b26\u4e32\u5f62\u5f0f *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span><span class=\"token punctuation\">)<\/span>ulIdleTaskStackSize <span class=\"token punctuation\">,<\/span>           <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u5927\u5c0f&#xff0c;\u5355\u4f4d\u4e3a\u5b57 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span>                            <span class=\"token comment\">\/* \u4efb\u52a1\u5f62\u53c2 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span>StackType_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span>     <span class=\"token comment\">\/* \u4efb\u52a1\u6808\u8d77\u59cb\u5730\u5740 *\/<\/span><br \/>\n                     <span class=\"token punctuation\">(<\/span>TCB_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskTCBBuffer <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/* \u4efb\u52a1\u63a7\u5236\u5757 *\/<\/span><br \/>\n    <span class=\"token comment\">\/* \u5c06\u4efb\u52a1\u6dfb\u52a0\u5230\u5c31\u7eea\u5217\u8868 *\/<\/span><br \/>\n    <span class=\"token function\">vListInsertEnd<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> pxReadyTasksLists<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>TCB_t <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pxIdleTaskTCBBuffer<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>xStateListItem <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1end&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;*\/<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u624b\u52a8\u6307\u5b9a\u7b2c\u4e00\u4e2a\u8fd0\u884c\u7684\u4efb\u52a1 *\/<\/span><br \/>\n    pxCurrentTCB <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u521d\u59cb\u5316\u7cfb\u7edf\u65f6\u57fa\u8ba1\u6570\u5668 *\/<\/span><br \/>\n    xTickCount <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span> TickType_t <span class=\"token punctuation\">)<\/span> <span class=\"token number\">0U<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u542f\u52a8\u8c03\u5ea6\u5668 *\/<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token function\">xPortStartScheduler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> pdFALSE <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/* \u8c03\u5ea6\u5668\u542f\u52a8\u6210\u529f&#xff0c;\u5219\u4e0d\u4f1a\u8fd4\u56de&#xff0c;\u5373\u4e0d\u4f1a\u6765\u5230\u8fd9\u91cc *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>&#xff08;2&#xff09;for(i&#061;0; i&lt;configMAX_PRIORITIES; i&#043;&#043;)&#xff1a; \u626b\u63cf\u5c31\u7eea\u5217\u8868\u4e2d\u6240\u6709\u4efb\u52a1\u7684 xTicksToDelay&#xff0c;\u5982\u679c\u4e0d\u4e3a 0&#xff0c;\u5219\u51cf 1\u3002\u8be5if&#xff08;&#xff09;\u8bed\u53e5\u8c03\u7528\u4e86&#xff1a;<br \/>\nlistGET_OWNER_OF_HEAD_ENTRY&#xff0c;\u5b8f\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">listGET_OWNER_OF_HEAD_ENTRY<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> pxList <span class=\"token punctuation\">)<\/span>  <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> pxList <span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>xListEnd <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>pxNext<span class=\"token operator\">-&gt;<\/span>pvOwner <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u53ef\u4ee5\u770b\u5230\u8be5\u5b8f\u5b9a\u4e49\u662f\u8bbf\u95ee\u6bcf\u4e2a\u94fe\u8868\u7684\u7b2c\u4e00\u4e2a\u8282\u70b9\u7684pvOwner\u6210\u5458&#xff0c;\u4e5f\u5c31\u662f\u62ff\u5230\u7b2c\u4e00\u4e2a\u8282\u70b9\u7684\u4efb\u52a1TCB&#xff0c;\u63a5\u7740\u5c31\u53ef\u4ee5\u8bbf\u95ee\u8fd9\u4e2aTCB\u7684xTicksToDelay\u6210\u5458&#xff08;\u53ef\u4ee5\u770b\u5230\u8fd9\u4e2a\u662f\u6709\u7f3a\u9677\u7684&#xff0c;\u53ea\u80fd\u67e5\u770b\u7b2c\u4e00\u4e2a\u8282\u70b9&#xff0c;\u6240\u4ee5\u5904\u4e8e\u963b\u585e\u72b6\u6001\u7684\u4efb\u52a1\u662f\u4e0d\u5728\u5c31\u7eea\u94fe\u8868\u7684&#xff0c;\u800c\u4e14\u662f\u5728\u5ef6\u65f6\u94fe\u8868&#xff09;<\/p>\n<p>&#xff08;3&#xff09;portYIELD()&#xff1a; \u6267\u884c\u4e00\u6b21\u4efb\u52a1\u5207\u6362\u3002\u8054\u5408\u524d\u9762\u7684vTaskSwitchContext&#xff08;&#xff09;\u51fd\u6570\u53ef\u4ee5\u77e5\u9053\u540e\u9762\u5c31\u4e0d\u7528\u5728\u4efb\u52a1\u7684\u540e\u9762\u8c03\u7528portYIELD()&#xff0c;\u4ee5\u540e\u4e0d\u7528\u5728\u4efb\u52a1\u4ee3\u7801\u540e\u9762\u624b\u52a8\u8c03 portYIELD()&#xff0c;\u4efb\u52a1\u5207\u6362\u7edf\u4e00\u7531 xTaskIncrementTick() \u5728\u6bcf\u6b21 tick \u65f6\u89e6\u53d1\u3002<\/p>\n<h4>&#xff08;5&#xff09;SysTick \u521d\u59cb\u5316\u51fd\u6570<\/h4>\n<p>SysTick \u7684\u4e2d\u65ad\u670d\u52a1\u51fd\u6570\u8981\u60f3\u88ab\u987a\u5229\u6267\u884c&#xff0c;\u5219 SysTick \u5fc5\u987b\u5148\u521d\u59cb\u5316\u3002SysTick \u521d\u59cb\u5316\u51fd\u6570\u5728 port.c \u4e2d\u5b9a\u4e49<\/p>\n<p><span class=\"token comment\">\/* SysTick \u914d\u7f6e\u5bc4\u5b58\u5668 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">portNVIC_SYSTICK_CTRL_REG<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">volatile<\/span> <span class=\"token class-name\">uint32_t<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token number\">0xe000e010<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">portNVIC_SYSTICK_LOAD_REG<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">volatile<\/span> <span class=\"token class-name\">uint32_t<\/span> <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token number\">0xe000e014<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">configSYSTICK_CLOCK_HZ<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">configSYSTICK_CLOCK_HZ<\/span> <span class=\"token expression\">configCPU_CLOCK_HZ<\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u786e\u4fddSysTick\u7684\u65f6\u949f\u4e0e\u5185\u6838\u65f6\u949f\u4e00\u81f4 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">portNVIC_SYSTICK_CLK_BIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token number\">1UL<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">2UL<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">else<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">portNVIC_SYSTICK_CLK_BIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">portNVIC_SYSTICK_INT_BIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token number\">1UL<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">1UL<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">portNVIC_SYSTICK_ENABLE_BIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token number\">1UL<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">0UL<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n*************************************************************************<br \/>\n*                             \u521d\u59cb\u5316SysTick<br \/>\n*************************************************************************<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vPortSetupTimerInterrupt<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n     <span class=\"token comment\">\/* \u8bbe\u7f6e\u91cd\u88c5\u8f7d\u5bc4\u5b58\u5668\u7684\u503c *\/<\/span><br \/>\n    portNVIC_SYSTICK_LOAD_REG <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span> configSYSTICK_CLOCK_HZ <span class=\"token operator\">\/<\/span> configTICK_RATE_HZ <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1UL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u8bbe\u7f6e\u7cfb\u7edf\u5b9a\u65f6\u5668\u7684\u65f6\u949f\u7b49\u4e8e\u5185\u6838\u65f6\u949f<br \/>\n       \u4f7f\u80fdSysTick \u5b9a\u65f6\u5668\u4e2d\u65ad<br \/>\n       \u4f7f\u80fdSysTick \u5b9a\u65f6\u5668 *\/<\/span><br \/>\n    portNVIC_SYSTICK_CTRL_REG <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span> portNVIC_SYSTICK_CLK_BIT <span class=\"token operator\">|<\/span><br \/>\n                                  portNVIC_SYSTICK_INT_BIT <span class=\"token operator\">|<\/span><br \/>\n                                  portNVIC_SYSTICK_ENABLE_BIT <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>**&#xff08;1&#xff09;SysTick \u914d\u7f6e\u5bc4\u5b58\u5668&#xff1a;**\u914d\u7f6e SysTick \u9700\u8981\u7528\u5230\u7684\u5bc4\u5b58\u5668\u548c\u5b8f\u5b9a\u4e49&#xff0c;\u5728 port.c \u4e2d\u5b9e\u73b0\u3002<\/p>\n<p>&#xff08;2&#xff09;portNVIC_SYSTICK_LOAD_REG &#061; ( configSYSTICK_CLOCK_HZ \/ configTICK_RATE_HZ ) &#8211; 1UL&#xff1a; \u8bbe\u7f6e\u91cd\u88c5\u8f7d\u5bc4\u5b58\u5668\u7684\u503c&#xff0c;\u51b3\u5b9a SysTick \u7684\u4e2d\u65ad\u5468\u671f\u3002\u4ece\u4ee3\u7801\u6e05\u5355 9-10(1) \u53ef \u4ee5 \u77e5 \u9053 &#xff1a; \u5982 \u679c \u6ca1 \u6709 \u5b9a \u4e49 configSYSTICK_CLOCK_HZ \u90a3 \u4e48configSYSTICK_CLOCK_HZ \u5c31 \u7b49 \u4e8e configCPU_CLOCK_HZ &#xff0c;configSYSTICK_CLOCK_HZ \u786e \u5b9e \u6ca1 \u6709 \u5b9a \u4e49 &#xff0c; \u5219 configSYSTICK_CLOCK_HZ \u7531 \u5728FreeRTOSConfig.h \u4e2d\u5b9a\u4e49\u7684 configCPU_CLOCK_HZ \u51b3\u5b9a&#xff0c;\u540c\u65f6 configTICK_RATE_HZ \u4e5f\u5728 FreeRTOSConfig.h \u4e2d\u5b9a\u4e49<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">configCPU_CLOCK_HZ<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token punctuation\">)<\/span> <span class=\"token number\">25000000<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">configTICK_RATE_HZ<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span> TickType_t <span class=\"token punctuation\">)<\/span> <span class=\"token number\">100<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u8fd9\u6b65\u8ba1\u7b97\u516c\u5f0f\u5982\u4e0b&#xff1a;<\/p>\n<p>LOAD &#061; 25M \/ 100 &#8211; 1 &#061; 249999        \u2192 \u8ba1\u6570\u5668\u8ba1 250000 \u4e2a\u65f6\u949f<br \/>\n\u6bcf\u4e2a\u65f6\u949f\u5468\u671f &#061; 1\/25M &#061; 40ns<br \/>\n\u4e2d\u65ad\u5468\u671f &#061; 250000 \u00d7 40ns &#061; 10ms      \u2192 \u662f\u3010\u4e58\u6cd5\u3011<\/p>\n<p>portNVIC_SYSTICK_CTRL_REG&#xff1a; \u8bbe\u7f6e\u7cfb\u7edf\u5b9a\u65f6\u5668\u7684\u65f6\u949f\u7b49\u4e8e\u5185\u6838\u65f6\u949f&#xff0c;\u4f7f\u80fd SysTick \u5b9a\u65f6\u5668\u4e2d\u65ad&#xff0c;\u4f7f\u80fd SysTick \u5b9a\u65f6\u5668\u3002<\/p>\n<p>\u6700\u540e\u8be5vPortSetupTimerInterrupt( )SysTick \u521d\u59cb\u5316\u51fd\u6570\u4f1a\u5728xPortStartScheduler&#xff08;&#xff09;\u542f\u52a8\u8c03\u5ea6\u5668\u51fd\u6570\u88ab\u8c03\u7528&#xff0c;\u5982\u4e0b&#xff1a;<\/p>\n<p>BaseType_t <span class=\"token function\">xPortStartScheduler<\/span><span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/* \u914d\u7f6ePendSV \u548c SysTick \u7684\u4e2d\u65ad\u4f18\u5148\u7ea7\u4e3a\u6700\u4f4e *\/<\/span><br \/>\nportNVIC_SYSPRI2_REG <span class=\"token operator\">|&#061;<\/span> portNVIC_PENDSV_PRI<span class=\"token punctuation\">;<\/span><br \/>\nportNVIC_SYSPRI2_REG <span class=\"token operator\">|&#061;<\/span> portNVIC_SYSTICK_PRI<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u521d\u59cb\u5316SysTick *\/<\/span><br \/>\n<span class=\"token function\">vPortSetupTimerInterrupt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u542f\u52a8\u7b2c\u4e00\u4e2a\u4efb\u52a1&#xff0c;\u4e0d\u518d\u8fd4\u56de *\/<\/span><br \/>\n<span class=\"token function\">prvStartFirstTask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u4e0d\u5e94\u8be5\u8fd0\u884c\u5230\u8fd9\u91cc *\/<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u603b\u7ed3&#xff1a;vPortSetupTimerInterrupt() \u5728\u542f\u52a8\u8c03\u5ea6\u5668\u88ab\u8c03\u7528\u540e&#xff0c;\u5c31\u4f1a\u4f7f\u80fd SysTick \u4e2d\u65ad&#xff0c;\u63a5\u7740\u6309\u7167\u6211\u4eec\u7684\u914d\u7f6e\u6bcf 10ms \u89e6\u53d1\u4e00\u6b21 SysTick \u4e2d\u65ad&#xff0c;\u968f\u540e\u8fdb\u5165 xPortSysTickHandler() \u4e2d\u65ad\u670d\u52a1\u51fd\u6570\u3002\u8be5\u51fd\u6570\u5148\u5173\u4e2d\u65ad&#xff08;vPortRaiseBASEPRI()&#xff09;&#xff0c;\u518d\u8c03\u7528 xTaskIncrementTick() \u51fd\u6570&#xff0c;\u8fd9\u4e2a\u51fd\u6570\u5e72\u4e09\u4ef6\u4e8b&#xff1a;<\/p>\n<li>\u7cfb\u7edf\u65f6\u57fa\u8ba1\u6570\u5668 xTickCount \u52a0 1&#xff08;\u66f4\u65b0\u7cfb\u7edf\u65f6\u57fa&#xff09;&#xff1b;<\/li>\n<li>\u626b\u63cf\u5c31\u7eea\u94fe\u8868&#xff08;\u76ee\u524d\u662f\u5c31\u7eea\u94fe\u8868&#xff0c;\u540e\u9762\u4f1a\u6539\u6210\u963b\u585e\u94fe\u8868&#xff09;\u4e2d\u6240\u6709\u4efb\u52a1\u7684 xTicksToDelay&#xff0c;\u5982\u679c\u4e0d\u4e3a 0 \u5219\u51cf 1&#xff1b;<\/li>\n<li>\u8c03\u7528 taskYIELD() \u51fd\u6570&#xff0c;\u5c06 PendSV \u7684\u60ac\u8d77\u4f4d\u7f6e 1\u3002<\/li>\n<p>\u968f\u540e\u5f00\u4e2d\u65ad&#xff08;vPortClearBASEPRIFromISR()&#xff09;&#xff0c;SysTick \u4e2d\u65ad\u89e3\u9664&#xff0c;PendSV \u4e2d\u65ad\u54cd\u5e94&#xff0c;\u5b8c\u6210\u4e00\u6b21\u4efb\u52a1\u5207\u6362\u3002<\/p>\n<p>\u6700\u540emian\u51fd\u6570\u5b9e\u73b0&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;FreeRTOS.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;task.h&#034;<\/span><\/span><\/p>\n<p>portCHAR flag1<span class=\"token punctuation\">;<\/span><br \/>\nportCHAR flag2<span class=\"token punctuation\">;<\/span><br \/>\nportCHAR flag3<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u5b9a\u4e49\u4efb\u52a1\u7684\u6808,StackType_t\u5c31\u662fuint32_t*\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TASK1_STACK_SIZE<\/span> <span class=\"token expression\"><span class=\"token number\">128<\/span><\/span><\/span><br \/>\nStackType_t Task1_Stack<span class=\"token punctuation\">[<\/span>TASK1_STACK_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u5b9a\u4e49\u4efb\u52a1\u7684TCB&#xff0c;\u7528\u6765\u63cf\u8ff0\u8be5\u4efb\u52a1\u7684\u4fe1\u606f*\/<\/span><br \/>\nTCB_t Task1TCB<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TASK2_STACK_SIZE<\/span> <span class=\"token expression\"><span class=\"token number\">128<\/span><\/span><\/span><br \/>\nStackType_t Task2_Stack<span class=\"token punctuation\">[<\/span>TASK2_STACK_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u5b9a\u4e49\u4efb\u52a1\u7684TCB&#xff0c;\u7528\u6765\u63cf\u8ff0\u8be5\u4efb\u52a1\u7684\u4fe1\u606f*\/<\/span><br \/>\nTCB_t Task2TCB<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u58f0\u660e\u5916\u90e8\u8c03\u7528\u5217\u8868\u9879*\/<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> List_t pxReadyTasksLists<span class=\"token punctuation\">[<\/span> configMAX_PRIORITIES <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u58f0\u660e\u8fd9\u4e24\u4e2a\u4efb\u52a1*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Task1_Entry<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> p_arg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Task2_Entry<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> p_arg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/*\u521d\u59cb\u5316\u5c31\u7eea\u5217\u8868*\/<\/span><br \/>\n<span class=\"token function\">prvInitialiseTaskLists<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">xTaskCreateStatic<\/span><span class=\"token punctuation\">(<\/span>Task1_Entry<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;Task1&#034;<\/span><span class=\"token punctuation\">,<\/span>TASK1_STACK_SIZE<span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span>Task1_Stack<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u5c06\u4efb\u52a11\u7684\u8282\u70b9\u63d2\u5165\u5230\u5c31\u7eea\u94fe\u88680\u4e2d*\/<\/span><br \/>\n<span class=\"token function\">vListInsertEnd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>pxReadyTasksLists<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Task1TCB<span class=\"token punctuation\">.<\/span>xStateListItem<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">xTaskCreateStatic<\/span><span class=\"token punctuation\">(<\/span>Task2_Entry<span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;Task2&#034;<\/span><span class=\"token punctuation\">,<\/span>TASK1_STACK_SIZE<span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span>Task2_Stack<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Task2TCB<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u5c06\u4efb\u52a12\u7684\u8282\u70b9\u63d2\u5165\u5230\u5c31\u7eea\u94fe\u88681\u4e2d*\/<\/span><br \/>\n<span class=\"token function\">vListInsertEnd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>pxReadyTasksLists<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>Task2TCB<span class=\"token punctuation\">.<\/span>xStateListItem<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u5f00\u542f\u8c03\u5ea6\u5668*\/<\/span><br \/>\n<span class=\"token function\">vTaskStartScheduler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u8f6f\u4ef6\u5ef6\u65f6 *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">delay<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint32_t<\/span> count<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span> count<span class=\"token operator\">!&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> count<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u4efb\u52a11&#xff0c;\u76ee\u524d\u6ca1\u6709\u53c2\u6570\u4f20\u8fdb\u6765&#xff0c;\u4e0d\u8fc7\u540e\u9762\u4f1a\u7528\u5230\u5148\u5b9a\u4e49\u4e00\u4e2avoid*\u6307\u9488*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Task1_Entry<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> p_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nflag1<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\nflag2<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nflag3<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">vTaskDelay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u4efb\u52a12*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">Task2_Entry<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> p_arg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nflag1<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nflag2<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\nflag3<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">vTaskDelay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1*\/<\/span><br \/>\nStackType_t IdleTaskStack<span class=\"token punctuation\">[<\/span>configMINIMAL_STACK_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u5b9a\u4e49\u4efb\u52a1\u7684TCB&#xff0c;\u7528\u6765\u63cf\u8ff0\u8be5\u4efb\u52a1\u7684\u4fe1\u606f*\/<\/span><br \/>\nTCB_t IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/*\u4e8c\u7ea7\u6307\u9488\u51fd\u6570&#xff0c;\u53c2\u6570\u662f\u4e8c\u7ea7\u6307\u9488&#xff0c;\u6307\u5411\u4e00\u7ea7\u6307\u9488*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">vApplicationGetIdleTaskMemory<\/span><span class=\"token punctuation\">(<\/span> TCB_t <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ppxIdleTaskTCBBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                    StackType_t <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>ppxIdleTaskStackBuffer<span class=\"token punctuation\">,<\/span><br \/>\n                                    <span class=\"token class-name\">uint32_t<\/span> <span class=\"token operator\">*<\/span>pulIdleTaskStackSize <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token operator\">*<\/span>ppxIdleTaskTCBBuffer<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&amp;<\/span>IdleTaskTCB<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">*<\/span>ppxIdleTaskStackBuffer<span class=\"token operator\">&#061;<\/span>IdleTaskStack<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token operator\">*<\/span>pulIdleTaskStackSize<span class=\"token operator\">&#061;<\/span>configMINIMAL_STACK_SIZE<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7a7a\u95f2\u4efb\u52a1&#xff1a;<\/p>\n<p><span class=\"token comment\">\/*\u521b\u5efa\u7a7a\u95f2\u4efb\u52a1*\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token function\">portTASK_FUNCTION<\/span><span class=\"token punctuation\">(<\/span> prvIdleTask<span class=\"token punctuation\">,<\/span> pvParameters <span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/* \u9632\u6b62\u7f16\u8bd1\u5668\u7684\u8b66\u544a *\/<\/span><br \/>\n<span class=\"token punctuation\">(<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">)<\/span> pvParameters<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\nflag1<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nflag2<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nflag3<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">vTaskDelay<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/* \u7a7a\u95f2\u4efb\u52a1\u6682\u65f6\u4ec0\u4e48\u90fd\u4e0d\u505a *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>&#xff08;6&#xff09;\u5b9e\u9a8c\u73b0\u8c61\u5982\u4e0b&#xff1a;<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/10\/20261006172528-6ac52f086f77d.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><br \/>\n\u53ef\u4ee5\u770b\u5230\u4efb\u52a1\u4e00\u5148\u6267\u884c&#xff0c;\u7136\u540e\u8fdb\u5165\u963b\u585e\u72b6\u6001&#xff0c;\u4efb\u52a1\u4e8c\u6267\u884c\u7136\u540e\u53c8\u8fdb\u5165\u963b\u585e\u72b6\u6001&#xff0c;\u6700\u540e\u5f88\u957f\u4e00\u6bb5\u65f6\u95f4\u90fd\u662f\u7a7a\u95f2\u4efb\u52a1\u6267\u884c&#xff0c;\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462&#xff1f;\u56e0\u4e3a\u4efb\u52a1\u4e00\u548c\u4efb\u52a1\u4e8c\u53ea\u6267\u884c\u51e0\u5fae\u79d2&#xff0c;\u800c vTaskDelay(1) \u4f9d\u9760\u7684\u4e2d\u65ad\u670d\u52a1\u51fd\u6570&#xff08;SysTick \u4e2d\u65ad&#xff09;\u6765\u9012\u51cf\u5ef6\u65f6\u8ba1\u6570&#xff0c;\u800c\u6211\u4eec tick \u4e2d\u65ad\u662f 10ms \u624d\u89e6\u53d1\u4e00\u6b21&#xff0c;\u4e5f\u5c31\u662f\u5728\u8fd9\u5c06\u8fd1 10ms \u65f6\u95f4\u5185&#xff0c;\u4efb\u52a1\u4e00\u548c\u4efb\u52a1\u4e8c\u7684\u5ef6\u65f6\u8ba1\u6570\u90fd\u4e0d\u4f1a\u88ab\u9012\u51cf&#xff0c;\u6240\u4ee5\u5b83\u4eec\u90fd\u65e0\u6cd5\u88ab\u8c03\u5ea6\u6267\u884c&#xff0c;\u624d\u4f1a\u5bfc\u81f4\u540e\u9762\u5f88\u957f\u7684\u65f6\u95f4\u90fd\u662f\u7a7a\u95f2\u4efb\u52a1\u6267\u884c\u3002\u90a3\u6211\u4eec\u628a vTaskDelay(1) \u5220\u9664\u8bd5\u8bd5\u5462&#xff1f;<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/10\/20261006172529-6ac52f09be79b.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/10\/20261006172531-6ac52f0b16f12.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><br \/>\n\u53ef\u4ee5\u770b\u5230\u7a7a\u95f2\u4efb\u52a1\u4e0d\u88ab\u6267\u884c&#xff0c;\u800c\u4efb\u52a1\u4e00\u548c\u4efb\u52a1\u4e8c\u8f6e\u6d41\u5207\u6362&#xff0c;\u65f6\u95f4\u95f4\u9694\u4e3a10ms<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e34\u754c\u6bb5\u4fdd\u62a4&#xff1a;<br \/>\n&#xff08;1&#xff09;\u4ec0\u4e48\u662f\u4e34\u754c\u6bb5&#xff1a;<br \/>\n\u4e34\u754c\u6bb5\u7528\u4e00\u53e5\u8bdd\u6982\u62ec\u5c31\u662f\u4e00\u6bb5\u5728\u6267\u884c\u7684\u65f6\u5019\u4e0d\u80fd\u88ab\u4e2d\u65ad\u7684\u4ee3\u7801\u6bb5\u3002\u5728 FreeRTOS \u91cc\u9762&#xff0c;\u8fd9\u4e2a\u4e34\u754c\u6bb5\u6700\u5e38\u51fa\u73b0\u7684\u5c31\u662f\u5bf9\u5168\u5c40\u53d8\u91cf\u7684\u64cd\u4f5c&#xff0c;\u5168\u5c40\u53d8\u91cf\u5c31\u597d\u50cf\u662f\u4e00\u4e2a\u67aa\u628a\u5b50&#xff0c;\u8c01\u90fd\u53ef\u4ee5\u5bf9\u4ed6\u5f00\u67aa&#xff0c;\u4f46\u662f\u6211\u5f00\u67aa\u7684\u65f6\u5019&#xff0c;\u4f60\u5c31\u4e0d\u80fd\u5f00\u67aa&#xff0c;\u5426\u5219\u5c31\u4e0d\u77e5\u9053\u662f\u8c01\u547d\u4e2d\u4e86\u9776\u5b50\u3002<br \/>\n**\u90a3\u4e48\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4e34\u754c\u6bb5\u4f1a\u88ab\u6253\u65ad&#xff1f;\u4e00\u4e2a\u662f\u7cfb\u7edf\u8c03\u5ea6&amp;#x<\/p>\n","protected":false},"author":2,"featured_media":113634,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[174,217,270],"topic":[],"class_list":["post-113638","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-c","tag-stm32","tag-270"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/113638.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u4e34\u754c\u6bb5\u4fdd\u62a4&#xff1a; &#xff08;1&#xff09;\u4ec0\u4e48\u662f\u4e34\u754c\u6bb5&#xff1a; \u4e34\u754c\u6bb5\u7528\u4e00\u53e5\u8bdd\u6982\u62ec\u5c31\u662f\u4e00\u6bb5\u5728\u6267\u884c\u7684\u65f6\u5019\u4e0d\u80fd\u88ab\u4e2d\u65ad\u7684\u4ee3\u7801\u6bb5\u3002\u5728 FreeRTOS \u91cc\u9762&#xff0c;\u8fd9\u4e2a\u4e34\u754c\u6bb5\u6700\u5e38\u51fa\u73b0\u7684\u5c31\u662f\u5bf9\u5168\u5c40\u53d8\u91cf\u7684\u64cd\u4f5c&#xff0c;\u5168\u5c40\u53d8\u91cf\u5c31\u597d\u50cf\u662f\u4e00\u4e2a\u67aa\u628a\u5b50&#xff0c;\u8c01\u90fd\u53ef\u4ee5\u5bf9\u4ed6\u5f00\u67aa&#xff0c;\u4f46\u662f\u6211\u5f00\u67aa\u7684\u65f6\u5019&#xff0c;\u4f60\u5c31\u4e0d\u80fd\u5f00\u67aa&#xff0c;\u5426\u5219\u5c31\u4e0d\u77e5\u9053\u662f\u8c01\u547d\u4e2d\u4e86\u9776\u5b50\u3002 **\u90a3\u4e48\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4e34\u754c\u6bb5\u4f1a\u88ab\u6253\u65ad&#xff1f;\u4e00\u4e2a\u662f\u7cfb\u7edf\u8c03\u5ea6&amp;#x\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/113638.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-06T17:25:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/10\/20261006172528-6ac52f0828eb0.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/113638.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/113638.html\",\"name\":\"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-06T17:25:33+00:00\",\"dateModified\":\"2026-10-06T17:25:33+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/113638.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/113638.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/113638.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/113638.html","og_locale":"zh_CN","og_type":"article","og_title":"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u4e34\u754c\u6bb5\u4fdd\u62a4&#xff1a; &#xff08;1&#xff09;\u4ec0\u4e48\u662f\u4e34\u754c\u6bb5&#xff1a; \u4e34\u754c\u6bb5\u7528\u4e00\u53e5\u8bdd\u6982\u62ec\u5c31\u662f\u4e00\u6bb5\u5728\u6267\u884c\u7684\u65f6\u5019\u4e0d\u80fd\u88ab\u4e2d\u65ad\u7684\u4ee3\u7801\u6bb5\u3002\u5728 FreeRTOS \u91cc\u9762&#xff0c;\u8fd9\u4e2a\u4e34\u754c\u6bb5\u6700\u5e38\u51fa\u73b0\u7684\u5c31\u662f\u5bf9\u5168\u5c40\u53d8\u91cf\u7684\u64cd\u4f5c&#xff0c;\u5168\u5c40\u53d8\u91cf\u5c31\u597d\u50cf\u662f\u4e00\u4e2a\u67aa\u628a\u5b50&#xff0c;\u8c01\u90fd\u53ef\u4ee5\u5bf9\u4ed6\u5f00\u67aa&#xff0c;\u4f46\u662f\u6211\u5f00\u67aa\u7684\u65f6\u5019&#xff0c;\u4f60\u5c31\u4e0d\u80fd\u5f00\u67aa&#xff0c;\u5426\u5219\u5c31\u4e0d\u77e5\u9053\u662f\u8c01\u547d\u4e2d\u4e86\u9776\u5b50\u3002 **\u90a3\u4e48\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4e34\u754c\u6bb5\u4f1a\u88ab\u6253\u65ad&#xff1f;\u4e00\u4e2a\u662f\u7cfb\u7edf\u8c03\u5ea6&amp;#x","og_url":"https:\/\/www.wsisp.com\/helps\/113638.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-06T17:25:33+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/10\/20261006172528-6ac52f0828eb0.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"13 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/113638.html","url":"https:\/\/www.wsisp.com\/helps\/113638.html","name":"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-06T17:25:33+00:00","dateModified":"2026-10-06T17:25:33+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/113638.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/113638.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/113638.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u6df1\u6316FreeRTOS\u5185\u6838\u5b9e\u73b0\uff08\u4e09\uff09"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/113638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=113638"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/113638\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/113634"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=113638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=113638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=113638"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=113638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}