【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除

时间:2023-03-08 20:40:45

一、实验说明:

  本例程建立三个任务,通过任务寄存器来实现任务的建立与删除功能。红灯和绿灯同时以固定

频率闪烁,当任务寄存器为5时,删除绿灯闪烁的任务LED1,此时只有红灯闪烁,当任务寄存器的

值为10时,创建绿灯闪烁任务,红绿灯又开始同时闪烁,如此循环往复执行。

二、源代码下载链接:

链接:https://pan.baidu.com/s/1c39VF4c 密码:zhkb

三、核心代码:

/*
* Name : main
* Description : ---
* Author : zh.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
/*实验现象:
红灯和绿灯同时以固定频率闪烁;当任务寄存器为5时,删除绿灯闪烁的任务LED1,
此时只有红灯闪烁;当任务寄存器的值为10时,创建绿灯闪烁任务,红绿灯又开始
同时闪烁;如此循环往复的执行。
*/
int main(void)
{
system_clock.initialize(); //系统时钟初始化
led.initialize(); //LED初始化
usart6.initialize(); //串口初始化 OSInit(); //UCOS初始化
OSTaskCreate(start_task, //创建开始任务
(void*), //任务参数
(OS_STK*)&START_TASK_STK[START_STK_SIZE-], //任务堆栈
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*),(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-],LED0_TASK_PRIO);//创建LED0任务
OSTaskCreate(led1_task,(void*),(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-],LED1_TASK_PRIO);//创建LED1任务
OSTaskCreate(usart_task,(void*),(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-],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(){
value = OSTaskRegGet ( , , & err ); //获取该任务寄存器的值
if ( value < ){
OSTaskRegSet ( , , ++ value, & err );//寄存器的值加一
if(value == ){
OSTaskDelReq(LED1_TASK_PRIO); //发送删除LED1任务请求,任务睡眠,无法恢复
}else if(value == ){
OSTaskRegSet ( , , , & err ); //寄存器值置零
OSTaskCreate(led1_task,
(void*),
(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-],
LED1_TASK_PRIO); //创建LED1任务
}
}
LED_RED_ON; //红灯亮
OSTimeDlyHMSM(,,,); //延时500ms
LED_RED_OFF; //红灯灭
OSTimeDlyHMSM(,,,); //延时500ms
}
}
/*
* Name : led_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void led1_task(void *pdata)
{
while(){
if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ){//判断是否有删除任务的请求
OSTaskDel(OS_PRIO_SELF); //删除任务本身TaskLed
}
LED_GREEN_ON; //绿灯亮
OSTimeDlyHMSM(,,,); //延时1000ms
LED_GREEN_OFF; //绿灯灭
OSTimeDlyHMSM(,,,); //延时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(){
f+=0.1f; //浮点型运算
usart6.printf("float f=%.4f\r\n",f); //串口输出
OSTimeDlyHMSM(,,,); //延时500ms
}
}

iCore4链接:

【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除