1902_野火FreeRTOS教程內(nèi)核在STM32中用到的2個(gè)中斷PENDSV和SYSTICK
全部學(xué)習(xí)匯總:?g_FreeRTOS:?FreeRTOS學(xué)習(xí)筆記?(gitee.com)
上面是涉及到的源代碼,而這次需要分析的就是78、79行的兩個(gè)中斷。首先,需要確認(rèn)NVIC_SYSPRI2寄存器的作用。
進(jìn)一步看里面相關(guān)的定義,從這里看這個(gè)注釋與代碼出現(xiàn)了不一致的地方。也就是這個(gè)0xe000ed20地址究竟是哪一個(gè)寄存器的地址,注釋與代碼的描述并不相同。
這么看,注釋寫的應(yīng)該是更加準(zhǔn)確一些。
這里,進(jìn)一步補(bǔ)充一下對(duì)應(yīng)的寄存器信息如上述截圖。
void?print_regs_info(void)
{
????printf("portNVIC_PENDSV_PRI?=?%x\n",?portNVIC_PENDSV_PRI);
????printf("portNVIC_SYSTICK_PRI?=?%x\n",?portNVIC_SYSTICK_PRI);
}
增加上面的代碼,直接打印一下結(jié)果如上。那么,上面的兩個(gè)寄存器設(shè)置其實(shí)是把高位的兩個(gè)字節(jié)全都設(shè)置為了每一個(gè)bit都是1。
再次結(jié)合這一個(gè)信息,上面的操作有效的部分其實(shí)是把這兩個(gè)字節(jié)的高4bit全都設(shè)置為了1。
再結(jié)合這部分信息,可以看得出來(lái)注釋的描述其實(shí)是對(duì)的。這兩個(gè)語(yǔ)句的操作實(shí)現(xiàn)的功能更是把Systick以及PendSV中斷的優(yōu)先級(jí)設(shè)置為15,也就是最低。其實(shí),功能分析到此,現(xiàn)在這兩個(gè)中斷的優(yōu)先級(jí)究竟應(yīng)該設(shè)置為多少是合理的暫且還是不明確的。
接下來(lái),再看一下啟動(dòng)第一個(gè)任務(wù)的實(shí)現(xiàn)。首先看93行,這個(gè)是KEIL中的一個(gè)偽指令,主要實(shí)現(xiàn)的功能是保證匯編代碼中的堆棧能夠按照8字節(jié)對(duì)齊。那么,0xE000ED08這個(gè)地址是哪個(gè)寄存器呢?按照注釋,直接找一下文檔看看是否一致。
首先確認(rèn)SCB的基地址,接下來(lái)看偏移量。
偏移量從手冊(cè)中查出來(lái)是0x08,因此兩個(gè)組合出來(lái)的這個(gè)地址就是SCB_VTOR的地址。那么,這個(gè)寄存器中的數(shù)值現(xiàn)在是多少呢?直接通過(guò)代碼打印一下,對(duì)應(yīng)的測(cè)試代碼:
void?print_regs_info(void)
{
????/*ldr?r0,?=0xE000ED08
????ldr?r0,?[r0]
????ldr?r0,?[r0]*/
????uint32_t?reg_value?=?0xE000ED08;
????printf("result?1:?0x%x\n",?reg_value);
????reg_value?=?*((uint32_t?*)reg_value);
????printf("result?2:?0x%x\n",?reg_value);
????reg_value?=?*((uint32_t?*)reg_value);
????printf("result?3:?0x%x\n",?reg_value);
}
調(diào)用的位置在調(diào)度器啟動(dòng)之前。
這是打印出來(lái)的效果。
這樣,繼續(xù)之前的匯編第102行。這一個(gè)操作實(shí)現(xiàn)的額是給msp設(shè)置數(shù)值為0x20001780。
這個(gè)地址區(qū)從手冊(cè)中可以查出來(lái)是SRAM的區(qū)域,這樣,這一句實(shí)現(xiàn)的作用就是設(shè)置了堆棧在RAM區(qū)域的位置。
這跟直接從仿真器中看到的寄存器數(shù)值也是一致的。各種仿真器千差萬(wàn)別,有時(shí)候覺(jué)得最順手的似乎還是printf。
上面的這個(gè)MSP的操作看起來(lái)的確是有一點(diǎn)莫名其妙,或許是為了兼容不同的啟動(dòng)代碼而設(shè)計(jì)?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-834061.html
繼續(xù)往下,主動(dòng)產(chǎn)生一次系統(tǒng)調(diào)用。這里的參數(shù)0會(huì)被處理器給忽略掉,沒(méi)有什么實(shí)際的作用。為什么還有這么一個(gè)參數(shù),主要還是為了保證語(yǔ)法的正確性吧。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-834061.html
到了這里,關(guān)于1902_野火FreeRTOS教程內(nèi)核在STM32中用到的2個(gè)中斷PENDSV和SYSTICK的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!