|
关于小小OS的详细说明,可以去amobbs上看,也可以看本文末尾的附件资料。如果还没了解过这个OS,可以参照ucos, FreeRtos理解,就是解决MCU多任务运行问题。MCU多任务OS的核心就是任务切换的处理,ucos, FreeRtos都是要保存上下文,需要用很多RAM和很多时间。小小OS切换任务时不需保存那一堆特殊功能寄存器,只需要在退出任务的地方做个标识,下次运行这个任务函数时,根据标识直接跳到上次退出的地方接着运行。因此小小OS代码简单,资源要求非常少,除了不能像ucos, FreeRtos那样在中断里切换任务外,其它功能都可实现
原版的小小OS只实现了ucos的一部分功能,但理解了多任务系统的原理和小小OS的运行机制后,可按实际需要自行增加功能
#define SUSPEND_TASK_A(TaskID) timers[TaskID]=0xff//使其它任务休眠,例如按暂停键停止加热,在按键任务里调用SUSPEND_TASK_A(TASK_HEAT)
#define SUSPEND_TASK_B() return 255 //使本任务休眠,确定不需要本任务运行了可以退出任务调度
#define IS_RUNNING_TASK(TaskID) ((timers[TaskID] != 0xff) ? 1 : 0)//查询某个任务是否在运行
#define WAKEUP_TASK_A(TaskID) \
timers[TaskID]=0x0; \
SET_WAKE_UP_FLAG(TaskID)//唤醒某个任务,并使这个任务从头开始运行
#define WAKEUP_TASK_B(TaskID) \
timers[TaskID]=0x0//唤醒某个任务,并使这个任务从上次退出的地方接着运行
#define SUSPEND_TASK_C() {STATE=A; return 0xff;}//使本任务休眠,唤醒后接着运行
#define IS_WAKED_UP(N, M) if(wake_task_##M==0) \
{ \
switch(STATE){ STATES##N;} \
} \
else \
{STATE=0x0; wake_task_##M=0;}//上面的wake_task_##M指的是wake_task_0/1/2...,是全局变量,用于标记任务唤醒时需不需要从头开始运行
#define _SS_W(N, TaskID) static unsigned char STATE=0; \
IS_WAKED_UP(N, TaskID)//在每个任务的开头,判断任务是否需要从头运行,还是接着上次退出的地方运行
原版的信号量处理方式,我认为不太合理,应该仿照ucos的做法
#if USE_SEM
#define SEM_TASK_NUM 2
uint8_t sem_1_task[SEM_TASK_NUM];//定义一个数组,元素个数是使用此信号量的任务个数
#define WaitSem(A,n,TaskID) do{STATE=A; sem_task[n]=TaskID;} while(0);
#define SendSem(sem) do{timers[sem_1_task[0]]=0x0; timers[sem_1_task[1]]=0x0;} while(0);
#endif |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|