|
ucos2移植尝试:“剔除”空闲任务,并不是真的剔除,
空闲任务控制块仍然存在,同样参与调度,只是任务空闲时,并不是进入空闲任务,而是直接切换到主函数。
没有了空闲任务,也就不用给空闲任务分配堆栈了。只支持OS_TASK_CREATE_EXT_EN为0的情况。
ucos不熟,只是移植尝试,不保证正确。
没有在硬件平台测试。
移植平台:atmega16+iaravr,atmega16+avrgcc,cc1110+iar8051
#include "config.h"
#define TASK1_STK_SIZE 150
#define TASK2_STK_SIZE 150
OS_STK Task1Stk[TASK1_STK_SIZE];
OS_STK Task2Stk[TASK2_STK_SIZE];
void Task1(void *pdata)
{
volatile float f1=(int)pdata;
while(1)
{
PORTD^=0x80;
f1+=0.1; //浮点数测试
OSTimeDly(2);
}
}
void Task2(void *pdata)
{
volatile float f2=(int)pdata;
while(1)
{
PORTD^=0x40;
f2+=0.1; //浮点数测试
OSTimeDly(3);
}
}
int main(void)
{
DDRD=_BV(7)|_BV(6);
PORTD=_BV(7)|_BV(6);
TCNT2 = 0;
TCCR2=_BV(WGM21) | T2_CLK_DIV_128;
OCR2=OCR2_INIT;
TIFR|=_BV(OCF2);
TIMSK=_BV(OCIE2);
OSInit();
OSTaskCreate(Task1,(void *)1,&Task1Stk[TASK1_STK_SIZE-1],1);
OSTaskCreate(Task2,(void *)2,&Task2Stk[TASK2_STK_SIZE-1],2);
OSStart();
volatile float f3=0;
sei(); //主函数(相当于空闲任务)开中断
while(1)
{
CRITICAL() //临界段段
{
OSIdleCtr++;
}
OSTaskIdleHook();
f3+=0.1;
}
}
ISR(TIMER2_COMP_vect)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
点击此处下载 ourdev_453558.rar(文件大小:300K) (原文件名:ucos.7z.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|