標題: stm32上ucosii的工作流程從啟動代碼到ucosii的匯編 [打印本頁]
作者: heila 時間: 2015-12-9 01:16
標題: stm32上ucosii的工作流程從啟動代碼到ucosii的匯編
本文章介紹在stm32上也就是cortex m3核的基礎(chǔ)上ucosii是如何運行起來的。
打卡啟動代碼 xx_cl.s
首先stm32起來后首先進入啟動代碼,
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
啟動代碼中,系統(tǒng)初始化完成,然后在 dummy exception中喚醒一些中斷,其中ucosii用到的系統(tǒng)滴答中斷和cpu任務(wù)掛起切換的中斷。按著箭頭往下走。
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
OS_CPU_PendSVHandler\
PROC
EXPORT OS_CPU_PendSVHandler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
關(guān)于這兩個函數(shù)的位置,OS_CPU_PendSVHandler這個在os_cpu_a.asm里邊有實體定義
OS_CPU_PendSVHandler
CPSID I ; Prevent interruption during context switch
MRS R0, PSP ; PSP is process stack pointer
CBZ R0, OS_CPU_PendSVHandler_nosave ; Skip register save the first time
SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack
STM R0, {R4-R11}
LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;
LDR R1, [R1]
STR R0, [R1] ; R0 is SP of process being switched out
; At this point, entire context of process has been saved
OS_CPU_PendSVHandler_nosave
PUSH {R14} ; Save LR exc_return value
LDR R0, =OSTaskSwHook ; OSTaskSwHook();
BLX R0
POP {R14}
這個就是關(guān)中斷,壓入堆棧切換任務(wù),OSTCBCur就是當前要切換任務(wù)的指針。
Sysytickhandler右鍵單擊即可進入他的實體定義,我們定義在it.c里邊,當然也有其他版本不在it.c里邊的。
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
這個函數(shù)就是一個1s延時中斷,為ucosii提供時鐘心臟。
接下來看main函數(shù)
int main(void)
{
INT8U ret = 0;
BspInit();
OSInit(); //uCOS-II
ret = OSTaskCreate( Start_Task,
(void*)0, &Start_TaskStk[PRIO_START_TASK_STK_SIZE-1],
PRIO_START_TASK); /
if(ret != OS_ERR_NONE)
{
OSStart();
}
Main里邊就一個外設(shè)初始化和ucosii初始化,OSStart(); 是正式開始進入任務(wù)調(diào)度了,
void OSStart (void)
{
if (OSRunning == OS_FALSE) {
OS_SchedNew(); /* Find highestpriority's task priority number */
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy =OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready torun */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); /* Execute targetspecific code to start task */
}
}
開始時是吧優(yōu)先級最高的賦給當前的任務(wù)指針OSTCBCur ,然后進入OSStartHighRdy();這個函數(shù),這個函數(shù)又在cpu_.a.asm里邊預(yù)定義。
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
MOVS R0, #0 ; Set the PSP to 0 for initial context switch call
MSR PSP, R0
LDR R0, =OSRunning ; OSRunning = TRUE
MOVS R1, #1
STRB R1, [R0]
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
CPSIE I ; Enable interrupts at processor level
OSStartHang
B OSStartHang
程序能順利的跑到這里基本就ok了。
文檔下載地址
ucosii的運行過程.pdf
(174.88 KB, 下載次數(shù): 29)
2015-12-9 01:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: cyxiaotian 時間: 2021-5-31 18:24
這寫的也太敷衍了。。
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
国产在线天堂
|
成人av一区二区三区在线观看
|
亚洲欧美国产高清va在线播放
|
91亚洲精品在线
|
精品国产999久久久免费
|
成人aaaa
|
男女裸体无遮挡做爰
|
国产精品一级二级
|
日韩一区二区三区在线
|
国产在线观看精品
|
在线看日韩|
欧美精品在线免费观看
|
国产精品第一区
|
韩国av免费
|
欧美日韩|
福利片在线观看
|
九月色婷婷
|
欧美精产国品一二三区
|
中文字幕在线免费
|
一区二区三区在线播放
|
欧美亚洲一区二区三区
|
久久私人影院
|
蜜桃色999
|
av网在线观看
|
国产午夜精品福利
|
黄色片中文字幕
|
国产一区二区精品丝袜
|
亚洲永久免费视频
|
成人免费视频网址
|
日本在线视频观看
|
午夜|
久久av片
|
国产高清视频
|
亚洲砖区区免费
|
成人国产精品一区二区
|
伊人操
|
亚洲精品蜜桃
|
久艹在线|
99cao|
午夜激情网
|
欧美在线不卡
|