您的位置:首页 > 其它

【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复

2018-02-01 09:14 253 查看
一、实验说明:

  当一个任务正在运行的时候,由于某种情况可能需要终止运行一段时间,终止的这段时间就是

所谓的任务的挂起,可以由该任务自身或者其他任务来挂起一个任务。当被挂起的任务需要再次运

行的时候,可以恢复被挂起的任务。本实验中红灯和绿灯以固定频率闪烁,当任务寄存器的值达到5

的时候,挂起绿灯闪烁任务,只剩下红灯闪烁,当任务寄存器的值达到10的时候,被挂起的绿灯闪

烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。

二、实验截图:



三、源代码下载链接:

链接:https://pan.baidu.com/s/1nwdjym1 密码:ugo5

四、核心代码:

/*
* Name                : main
* Description         : ---
* Author              : zh.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
/*实验现象:
最开始红灯和绿灯同时以固定频率闪烁,当任务寄存器的值达到5的时候,
挂起绿灯闪烁任务,只剩红灯闪烁;当任务寄存器值达到10的时候,被挂
起的绿灯闪烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。
*/
int main(void)
{
system_clock.initialize();                               //系统时钟初始化
led.initialize();                                        //LED初始化
usart6.initialize(115200);                               //串口初始化
usart6.printf("\x0c");                                   //清屏
usart6.printf("\033[1;32;40m");                          //设置字体终端为绿色
usart6.printf("\r\nHello, I am iCore4!\r\n\r\n");

OSInit();                                                          //UCOS初始化
OSTaskCreate(start_task,                                 //创建开始任务
(void*)0,                                   //任务参数
(OS_STK*)&START_TASK_STK[START_STK_SIZE-1], //任务堆栈
START_TASK_PRIO);                           //任务优先级
OSStart();                                               //开启UCOS
}


/*
* Name                : start_task
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr;

OSStatInit();//初始化统计任务

OS_ENTER_CRITICAL();//关中断

OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//创建LED0任务
OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//创建LED1任务
OSTaskCreate(usart_task,(void*)0,(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-1],USART_TASK_PRIO);//创建usart任务
OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务

OS_EXIT_CRITICAL();//开中断
}


/*
* Name                : led0_task
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
void led0_task(void *pdata)
{
INT8U      err;                            //定义错误类型
INT8U      value;                          //定义寄存器的值
while(1){
usart6.printf("The task1 is running.\r\n");
value = OSTaskRegGet ( 0, 0, & err );    //获取该任务寄存器的值
if( value < 10 ){
OSTaskRegSet ( 0, 0, ++ value, & err );//寄存器的值加一
}else{
OSTaskRegSet ( 0, 0, 0, & err );       //寄存器值置零
OSTaskResume (LED1_TASK_PRIO);         //恢复绿灯LED闪烁的任务
}
LED_RED_ON;                              //红灯亮
OSTimeDlyHMSM(0,0,0,500);                //延时500ms
LED_RED_OFF;                             //红灯灭
OSTimeDlyHMSM(0,0,0,500);                //延时500ms
}
}
/*
* Name                : led_task
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
void led1_task(void *pdata)
{
INT8U      err;                            //定义错误类型
INT8U      value;                          //定义寄存器的值

while(1){
usart6.printf("The task2 is running.\r\n");
value = OSTaskRegGet ( 0, 0, & err );    //获取该任务寄存器的值
if ( value < 10 ){
OSTaskRegSet ( 0, 0, ++ value, & err );//寄存器的值加一
}else{
OSTaskRegSet ( 0, 0, 0, & err );       //任务寄存器清0                                         //寄存器值置零
OSTaskSuspend (LED1_TASK_PRIO);        //挂起自身任务                                          //挂起自身任务
}
LED_GREEN_ON;                            //绿灯亮
OSTimeDlyHMSM(0,0,0,1000);               //延时1000ms
LED_GREEN_OFF;                           //绿灯灭
OSTimeDlyHMSM(0,0,0,1000);               //延时1000ms
}
}
/*
* Name                : usart_task
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
void usart_task(void *pdata)
{
double f=0.1;

while(1){
usart6.printf("The task3 is running.\r\n");
f+=0.1f;                                 //浮点型运算
usart6.printf("float f=%.4f\r\n",f);     //串口输出
OSTimeDlyHMSM(0,0,0,1000);               //延时1000ms
}
}


iCore4链接:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: