uboot的一些简单应用

1. 任务挂起与恢复:

   a. 可挂起自身,也可挂起别的任务。OSTaskSuspend(INT8U prio) ,当prio为OS_PRIO_SELF时,挂起自身

   b. 挂起和恢复将导致任务调度

   c. 挂起为附加功能,即若任务同时处于挂起和延迟状态,则延迟时间过后,还需等到任务恢复之后才能就绪

  void TaskStartA(void *pdata) { INT16U count = 0; pdata = pdata; // while (1) { PORTB_PB2 =~PORTB_PB2; OSTimeDly(100); // 1000ms count++; if(count == 10) { count = 0; OSTaskResume(PRIO_TASKB); // 恢复任务B } } } void TaskStartB(void *pdata) { INT16U count = 0; pdata = pdata; while(1) { PORTB_PB3 = ~PORTB_PB3; OSTimeDly(20); count++; if(count == 10) { OSTaskSuspend(OS_PRIO_SELF); count = 0; } } }

 

2. 任务延迟与取消延迟

   a. 调用延迟的任务将自己置于延迟态,不能延迟别的任务,任务延迟将导致任务调用

   b. OSTimeDlyResume()的参数为优先级,即取消的不是本身任务的延迟(本身任务无法取消自己的延迟)

  void TaskStartA(void *pdata) { pdata = pdata; OSTimeDly(1000); while(1) { PORTB_PB2 = ~PORTB_PB2; OSTimeDly(20); } } void TaskStartB(void *pdata) { pdata = pdata; OSTimeDlyResume(0); while(1) { PORTB_PB3 = ~PORTB_PB3; } }

3. 信号量的使用

  a. 首先要在主程序中创建信号量,OSSemCreate()参数为信号量的初始值

  b. 应检查OSSemPend()的错误标志

  c. OSSemPend()若能成功得到信号量,则当前任务继续运行,否则将发生任务切换

  d. OSSemPost()将导致任务调度

   OS_EVENT *RandomSem; // 声明一个事件控制块指针 RandomSem = OSSemCreate(1); // 建立一个信号量,1表示信号量初始值 void TaskStartB(void *pdata) { INT8U err; while(1) { OSSemPend(RandomSem,0, &err); if(err != OS_NO_ERR) //非超时退出 { PORTB_PB2 = ~PORTB_PB2; emPost(RandomSem); } OSTimeDly(20); } }

 

4. 互斥信号量的使用

  a. 信号量只能用于任务
  b. MutexCreate将创建一个任务且将占用PIP级任务控制块
  c. MutexPend会检查挂起请求的任务优先级是否比占据该互斥信号量的任务优先级高,若是,则占用优先级的任务将提升到PIP级。若当前

     任务(即挂起请求的任务)不能的到该互斥信号量,则将发生任务调度
  d. OSMutexPost将检查当前任务(也即调用OSMutexPost的任务)是否为PIP级,若是,则将当前任务还原成调用前的优先级;还将检查

     是否还有任务在等待该互斥信号量,若有,则将等待任务中优先级最高的任务置于就绪态,且将进行任务调度(注意,是优先级最高的,而

     不是先等待的)

  #include "includes.h" #define OS_TASK_STK_SIZE 64 OS_EVENT *ResourceMutex; OS_STK TaskPrio5Stk[OS_TASK_STK_SIZE]; OS_STK TaskPrio6Stk[OS_TASK_STK_SIZE]; OS_STK TaskPrio7Stk[OS_TASK_STK_SIZE]; void Basic_Init(void); void TaskPrio5(void *pdata); void TaskPrio6(void *pdata); void TaskPrio7(void *pdata); void main(void) { INT8U err; OSInit(); ResourceMutex = OSMutexCreate(4,&err); OSTaskCreate(TaskPrio5,(void *)0,&TaskPrio5Stk[OS_TASK_STK_SIZE - 1],5); OSTaskCreate(TaskPrio6,(void *)0,&TaskPrio6Stk[OS_TASK_STK_SIZE - 1],6); OSTaskCreate(TaskPrio7,(void *)0,&TaskPrio7Stk[OS_TASK_STK_SIZE - 1],7); Basic_Init(); OSStart(); } void TaskPrio5(void *pdata) { INT8U err; pdata = pdata; while(1) { OSMutexPend(ResourceMutex,0,&err); // 0:timeout PORTB_PB2 = ~PORTB_PB2; OSTimeDly(10); OSMutexPost(ResourceMutex); OSTimeDly(30); } } void TaskPrio6(void *pdata) { INT8U err; pdata = pdata; while(1) { OSMutexPend(ResourceMutex,0,&err); // 0:timeout PORTB_PB3 = ~PORTB_PB3; OSTimeDly(10); OSMutexPost(ResourceMutex); OSTimeDly(20); } } void TaskPrio7(void *pdata) { INT8U err; pdata = pdata; while(1) { OSMutexPend(ResourceMutex,0,&err); // 0:timeout PORTB_PB4 = ~PORTB_PB4; OSTimeDly(10); OSMutexPost(ResourceMutex); OSTimeDly(10); } } // 设备初始化 // RTI:10ms // 端口占用: PB2-PB4 // void Basic_Init(void) { // 实时时钟配置 RTICTL=0x49; //10ms Interrupt CRGINT_RTIE=1; //Enabe Interrupt // 端口配置 DDRB_DDRB2 = 1; // TaskA,PB2,输出 DDRB_DDRB3 = 1; // TaskB,PB3,输出 DDRB_DDRB4 = 1; }

 

 

你可能感兴趣的:(uboot的一些简单应用)