UCOS移植到MSP430过程与心得体会《4》
[复制链接]
以下是任务切换过程:
OSCtxSw push sr ; emulate interrupt by also saving the SR PUSHALL ; push all registers
mov.w &OSTCBCur, R13 ; OSTCBCur->OSTCBStkPtr = SP mov.w SP, 0(R13)
call #OSTaskSwHook
mov.b &OSPrioHighRdy, R13 ; OSPrioCur = OSPrioHighRdy mov.b R13, &OSPrioCur ;
mov.w &OSTCBHighRdy, R13 ; OSTCBCur = OSTCBHighRdy mov.w R13, &OSTCBCur ;
mov.w @R13, SP ; SP
OSTCBHighRdy->OSTCBStkPtr
POPALL ; pop all registers
reti
//如果没有其他任务要运行则挂起当前任务.运行空任务. //总的意思是: CPU让出10的时间段给别外的程序运行.如果时间到后,原来的任务,
void OS_TaskIdle (void *pdata) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif
pdata = pdata; /* Prevent compiler warning for not using 'pdata' */ for (;;) { OS_ENTER_CRITICAL(); OSIdleCtr++; OS_EXIT_CRITICAL(); OSTaskIdleHook(); /* Call user definable HOOK */ } }
如任务Task 与Task1
void task(void *pdata) { //pdata = pdata; //如果编译器报警,则重新加入此行代码 WDTCTL = WDT_MDLY_8; //设置时钟节拍间隔为32ms IE1 |= 0x01; //开看门狗定时器中断 //P4SEL &= BIT0;
P4DIR |=0xff; //P4OUT=0xff; while (1) { if(FlagLED==true) { LED=(LED==0x80)?(0x01):(LED<<1); P4OUT=LED; FlagLED=false; } if(FlagLED==false) { //P4OUT=0x80; FlagLED=true; }
// 将之改成10就成了流水灯. OSTimeDly(100); //定时函数括号内的内容为延时的时间,1S=100ms } } void task1(void *pdata) { WDTCTL=WDT_MDLY_8; //如果
IE1|=0X01; // P4DIR=0xFF; while(1) { if(FlagLED==true) { LED=(LED==0x80)?(0x01):(LED<<1); P4OUT=LED; FlagLED=false; } if(FlagLED==false) { //P4OUT=0x80; P4OUT=~0xaa; FlagLED=true; }
OSTimeDly(50); } }
任务Task1的优先级4 . Task的优先级为. 5 所以先定位到Task1的入口地址执行. 执行后遇到OSTimeDly() 任务挂起.切换到 Task 任务. 切换过程.如上< void OSTimeDly (INT16U ticks)>所示…如此反复.
从Main函数到任务切换的图如下所示
OSIint()
OSTaskCreate() OSStartHighRdy() OSTaskSwHook() Task1()
OSTimeDly()
OS_Sched()
OSTaskSwHook() Task()
OSTimeDly()
OS_Sched()
OSCtxSw()
OSTaskSwHook()
OSTaskIdleHook()
对于MSP430_UCOS的问题:
void task(void *pdata) { //pdata = pdata; //如果编译器报警,则重新加入此行代码 WDTCTL = WDT_MDLY_32; //设置时钟节拍间隔为32ms IE1 |= 0x01; //开看门狗定时器中断 P4DIR |=0xff; while (1) { if(FlagLED==true) { LED=(LED==0x80)?(0x01):(LED<<1); P4OUT=LED; FlagLED=false; } if(FlagLED==false) { FlagLED=true; } OSTimeDly(10); } }
|