嵌入式移植-UCOS移植-(函数详解)
1.系统滴答定时器SysTick
// 这是stm32flx系列官网下载的程序源码,每一个芯片系列的Systick配置是不一样的,需要根据要求自己设置或修改。
static void SysTickConfig(void)
{
uint16_t time=0;
//time = SystemCoreClock / 1000;
time = 10000;
if (SysTick_Config(time))//--10000 - 1ms ,
{
while (1);
}
/* Configure the SysTick handler priority */
NVIC_SetPriority(SysTick_IRQn, 0x0);
}
//定时器中断, 1ms中断一次
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
void TimingDelay_Decrement(void)
{
/*
OSIntEnter() - 对全局变量OSIntNesting增1,OSIntNesting为中断嵌套深度 - 进入中断
OSTimeTick() - 在时钟节拍到来时,检查每个任务的任务控制块中 OSTCBDly-1 后是否为0,如果为0 则刚才此任务为挂起状态,现在应该为就绪状态。
OSIntExit() -对OSIntNesting减1,刚好与OSIntEnter() 相对应。
*/
if(OSRunning)//OS已经在运行了
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
}
2.任务的创建与启动任务
INT8U OSTaskCreate(void (*task)(void *p_arg),//任务代码的地址
void *p_arg,//任务参数
OS_STK *ptos,//任务堆栈栈顶指针
INT8U prio)//任务的优先级
{
...
}
//启动任务,第一个任务
//-中断优先级LED2_TASK_PRIO的值越大,优先级越低;反之,值越小,优先级越大。
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata=pdata;
OSStatInit(); //初始化统计任务
OS_ENTER_CRITICAL(); //进入临界区,中断无法打断--原子操作
OSTaskCreate(led1_task,(void *)0,(OS_STK *)&LED1_TASK_STK[LED1_STK_SIZE-1]
,LED1_TASK_PRIO);
OSTaskCreate(led2_task,(void *)0,(OS_STK *)&LED2_TASK_STK[LED2_STK_SIZE-1]
,LED2_TASK_PRIO);
OSTaskCreate(led3_task,(void *)0,(OS_STK *)&LED3_TASK_STK[LED3_STK_SIZE-1]
,LED3_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务
OS_EXIT_CRITICAL(); //退出临界区,中断可以打断
}
OS_STAT_RDY 表示任务处于就绪状态
OS_STAT_SEM 表示任务处于等待信号量状态
OS_STAT_MBOX 表示任务处于等待消息邮箱状态
OS_STAT_Q 表示任务处于等待消息队列状态
OS_STAT_SUSPEND 表示任务处于被挂起状态
OS_STAT_MUTEX 表示任务处于等待互斥型信号量状态
3.任务挂起和恢复
注:任务挂起和恢复不可用于空闲任务
挂起函数:OSTaskSuspend(); 恢复函数:OSTaskReSume();
4.任务的删除
删除函数:OSTaskDel(INT8U prio);
5.信号量
OSSemPend的函数原型为:
void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U err)
pevent:就是要请求的信号量地址;
timeout:请求的超时时间,如果为0表示无限时等待;
err:用来返回是否出错。每执行一次
OSSemPend,OSEventCnt就会减1。如果OSEventCnt值为0,执行OSSemPend时,当时任务将因为无法得到相应的资源而被 挂起。
OSSemPost的函数原型为:
INT8U OSSemPost(OS_EVENT *pevent),
同样pevent 就是要发送的信号量地址;
每执行一次OSSemPost,OSEventCnt就会加1