基于stm32f103zet6之UC/OS_II的學(xué)習2(初步分析OS--點燈大法)
現(xiàn)在開始仔細分析,整個點燈大法是如何實現(xiàn)的。
一、硬件初始化。
在我這里是指對GPIO進行初始化
LED_GPIO_Config();//LED端口初始化
具體的配置就不多說了。
二、操作系統(tǒng)的初始化
OSInit();
接著我們看看這里面具體做了什么:
voidOSInit(void)
{
OSInitHookBegin();/*Callportspecificinitializationcode*/
OS_InitMisc();/*Initializemiscellaneousvariables*/
OS_InitRdyList();/*InitializetheReadyList*/
OS_InitTCBList();/*InitializethefreelistofOS_TCBs*/
OS_InitEventList();/*InitializethefreelistofOS_EVENTs*/
OS_InitTaskIdle();/*CreatetheIdleTask*/
OS_InitTaskStat();/*CreatetheStatisticTask*/
OSInitHookEnd();/*Callportspecificinit.code*/
}
上面是去掉一些宏開關(guān)的簡化代碼:
1、首先是hook函數(shù),下面結(jié)合官方文檔以及我自己的理解,談?wù)勥@個hook函數(shù)
本人理解,對于我們初學(xué)者來說hook函數(shù)是不需要管的,直接把宏開關(guān)關(guān)掉,因為操作系統(tǒng)的功能擴充
我們暫時還用不到,而這個hook函數(shù)就是實現(xiàn)對操作系統(tǒng)功能的擴充,之所以加上了這個hook函數(shù),就是為了
防止我們直接修改源代碼。從而對源代碼產(chǎn)生破壞!
也就是說我們可以直接把這兩個hook函數(shù)注釋掉,自己動手試試吧,我試過了!
2、接著是這個 OS_InitMisc(); 看注釋就是初始化各種各樣的變量。我們可以進去看看,代碼如下:
staticvoidOS_InitMisc(void)
{
#ifOS_TIME_GET_SET_EN>0
OSTime=0L;/*Clearthe32-bitsystemclock*/
#endif
OSIntNesting=0;/*Cleartheinterruptnestingcounter*/
OSLockNesting=0;/*Cleartheschedulinglockcounter*/
OSTaskCtr=0;/*Clearthenumberoftasks*/
OSRunning=OS_FALSE;/*Indicatethatmultitaskingnotstarted*/
OSCtxSwCtr=0;/*Clearthecontextswitchcounter*/
OSIdleCtr=0L;/*Clearthe32-bitidlecounter*/
#ifOS_TASK_STAT_EN>0
OSIdleCtrRun=0L;
OSIdleCtrMax=0L;
OSStatRdy=OS_FALSE;/*Statistictaskisnotready*/
#endif
}
從上面的代碼中我們可以獲得這樣的信息:
這幾行代碼完成的就是對系統(tǒng)定時器初值、中斷計數(shù)器、當前任務(wù)數(shù)量等進行清零,沒有別的意思了。
3、OS_InitRdyList這個函數(shù)看名字意思是初始化就緒態(tài)列表
那么就序列表指的就是任務(wù)處于三態(tài)中的就緒態(tài)的任務(wù),關(guān)于三態(tài)的詳細解釋可以百度一下!
那么還是一樣跟蹤進去看看代碼里面到底做了些什么、
staticvoidOS_InitRdyList(void)
{
INT8Ui;
#ifOS_LOWEST_PRIO<=63
INT8U*prdytbl;
#else
INT16U*prdytbl;
#endif
OSRdyGrp=0;/*Clearthereadylist*/
prdytbl=&OSRdyTbl[0];
for(i=0;i *prdytbl++ = 0;