您的位置:首页 > 其它

【iCore4 双核心板_uC/OS-II】例程十:信号量集

2018-03-07 08:58 399 查看

一、实验说明:

  在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式。UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/13USFy25QX-e3WjFGmGClfA 密码:jgmj

四、核心代码:

/*
* Name                : main
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
/*实验现象:
打开串口工具putty.exe,按下按键ARM.KEY,终端显示信号量集的状态;松开按键,停止显示。
信号量的16位分别循环置1。
*/
int main(void)
{
system_clock.initialize();                               //系统时钟初始化
led.initialize();                                        //LED初始化
usart6.initialize(115200);                               //串口初始化
key.initialize();

usart6.printf("\x0c");                                   //清屏
usart6.printf("\033[1;32;40m");                          //设置字体终端为绿色
usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");
LED_RED_ON;

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)
{
u8 err;
OS_CPU_SR cpu_sr;

TaskFlag = OSFlagCreate(0,&err);//创建信号量集

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

OS_ENTER_CRITICAL();//关中断

OSTaskCreate(AppTask1_task,(void*)0,(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-1],AppTask1_TASK_PRIO);//创建AppTask1任务
OSTaskCreate(AppTask2_task,(void*)0,(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-1],AppTask2_TASK_PRIO);//创建AppTask2任务
OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务

OS_EXIT_CRITICAL();//开中断
}
/*
* Name                : AppTask1_task
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
void AppTask1_task(void *pdata)
{
u8 err;
int i = 0;
while(1){
if(ARM_KEY_STATE == KEY_DOWN){                   //按键按下
i++;
if(i < OS_FLAGS_NBITS){
OSFlagPost(TaskFlag,i,OS_FLAG_SET,&err);     //设置第0位的信号为1
}else{
i=0;
}
}
OSTimeDlyHMSM(0,0,0,500);                        //延时500ms
}
}
/*
* Name                : AppTask2_task
* Description         : ---
* Author              : liu.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 07/12/2017
*
* create.
* --------------------
*/
void AppTask2_task(void *pdata)
{
u8 err;
u16 flag;

while(1){
flag = OSFlagQuery(TaskFlag,&err);                     //查询信号量集的状态
if(flag != 0){
usart6.printf("The %d bit is set to high.\r\n",flag);
OSFlagPost(TaskFlag,(OS_FLAGS)flag,OS_FLAG_CLR,&err);//信号置0
}
OSTimeDlyHMSM(0,0,0,500);                              //延时500ms
}
}

iCore4链接:

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