|
LM3S811学习体会-UCOS-信号量-邮箱练习
[复制链接]
声明:本人将ZLG 公司移植好的模板直接拿过来用的(在这里表示感谢),非本人移植。 本工程主要练习 任务的建立及 信号量、邮箱等的使用,本工程一共创建了四个任务(空闲及统计任务不算在内)。 1.taskStart主要用来建立任务(即通常说的用任务建立任务,当然不这么用以可以,个人习惯问题)信号量 邮箱 等 个人感觉这样比较清晰。 2.task1 使用 系统延时(使用时必须注意使能 在os_cfg.h中)实现 LED小灯闪烁,同时向任务2发送信号量。 3.task2等待信号量然后点亮并熄灭LED,同时向任务3发送邮箱(为延时信息) 4.task3等待邮箱 并根据邮箱传递来的延时 时间来改变LED的闪烁周期 main函数
- /*--------------文件信息---------------------------------------------------------
- * 文 件 名: main.c
- * 创 建 人: lixiaoxu
- * 创建日期: 2011年11月16日
- * 描 述: 主程序C语言入口
- * 说明:UCOS模板移植于 ZLG Company
- *---------- 版本信息------------------------------------------------------------
- * 版 本: V1.0
- *
- *-------------------------------------------------------------------------------*/
- #include "includes.h"
- /*********************************************************************************
- 任务优先级
- **********************************************************************************/
- #define TASK_START_PRIO 0
- #define TASK_1_PRIO 10
- #define TASK_2_PRIO2 11
- #define TASK_3_PRIO3 12
- /*********************************************************************************
- 任务堆栈大小
- *********************************************************************************/
- #define TASK_START_STK_SIZE 50 //定义任务堆栈大小
- #define TaskStkLengh_32 32
- #define TaskStkLengh_64 64
- #define TaskStkLengh_128 128
- #define TaskStkLengh_256 256
- static OS_STK Task_Start_Stk[TASK_START_STK_SIZE];
- static OS_STK Task_1_Stk[TaskStkLengh_64];
- static OS_STK Task_2_Stk[TaskStkLengh_64];
- static OS_STK Task_3_Stk[TaskStkLengh_64];
- /********************************************************************************
- 定义任务 信号量 邮箱 消息队列
- ********************************************************************************/
- OS_EVENT *AckSem;
- OS_EVENT *Delay_Mbox;
- /*******************************************************************************
- 函数声明
- *******************************************************************************/
- static void taskStart (void *pdata);
- static void task1 (void *pdata);
- static void task2 (void *pdata);
- static void task3 (void *pdata);
- /******************************************************************************
- * 本工程实现功能:实现邮箱、信号量的使用
- * 注意:
- *
- ******************************************************************************/
- int main (void)
- {
- OSInit(); //OS-II 初始化uC/OS-II的内核
- OSTaskCreate ( taskStart,
- (void *)0, //创建启动任务
- &Task_Start_Stk[TASK_START_STK_SIZE-1],
- TASK_START_PRIO );
- OSStart(); //Start uC/OS-II 启动uC/OS-II
- return(0) ;
- }
- /*********************************************************************************************************
- ** Function name: Task_Start
- ** Descriptions: Start task
- ** input parameters: *pdata
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- static void taskStart (void *pdata)
- {
- pdata = pdata;
- Set_System(); //用于mcu的配置
- OS_CPU_SysTickInit(); //启动系统SysTick 作为UCOS的时基
- #if OS_TASK_STAT_EN > 0 //使能统计功能
- OSStatInit();
- #endif
- //在这里创建 任务中所用到的 信号量 邮箱 消息队列
- AckSem = OSSemCreate(0); //创建信号量
- Delay_Mbox = OSMboxCreate((void *)0); //创建邮箱 由任务2向任务3发送LED闪烁间隔
- // 在这里创建要使用的任务
- OSTaskCreate (task1, (void *)0, //创建任务1
- &Task_1_Stk[TaskStkLengh_64-1],
- TASK_1_PRIO);
- OSTaskCreate (task2, (void *)0, //创建任务2
- &Task_2_Stk[TaskStkLengh_64-1],
- TASK_2_PRIO2);
- OSTaskCreate (task3, (void *)0, //创建任务2
- &Task_3_Stk[TaskStkLengh_64-1],
- TASK_3_PRIO3);
- while (1)
- {
- OSTaskSuspend(OS_PRIO_SELF); //挂起启动任务,也可以删除
- }
- }
- /*********************************************************************************************************
- ** Function name: task1
- ** Descriptions: 任务1
- ** input parameters: *pdata
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- static void task1 (void *pdata)
- {
- pdata = pdata;
- while (1)
- {
- GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED3
- OSTimeDlyHMSM(0,0,0,500); //延时0.5秒
- GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED3
- OSTimeDlyHMSM(0,0,0,500); //延时0.5秒
- OSSemPost (AckSem); //发送信号量
- }
- }
- /*********************************************************************************************************
- ** Function name: task2
- ** Descriptions: 任务2
- ** input parameters: *pdata
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- static void task2 (void *pdata)
- {
- INT8U err;
- u8 time = 1;
- pdata = pdata;
- while (1)
- {
- OSSemPend (AckSem, 0, &err); //等待信号量
- GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED4
- OSSemPend (AckSem, 0, &err); //等待信号量
- GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED4
- OSMboxPost(Delay_Mbox, &time); //发送邮箱 邮箱信息为 1和6 交替发送
- if(time ==6) time = 1;
- else time = 6;
- }
- }
- /*********************************************************************************************************
- ** Function name: task3
- ** Descriptions: 任务3
- ** input parameters: *pdata
- ** output parameters: 无
- ** Returned value: 无
- *********************************************************************************************************/
- static void task3 (void *pdata)
- {
- INT8U err;
- u8 *RX_Mbox; //存放邮箱信息
- pdata = pdata;
- while (1)
- {
- RX_Mbox = OSMboxPend(Delay_Mbox, 0, &err); //接收邮箱信息
- OSTimeDlyHMSM(0,0,*RX_Mbox,0); //延时x秒
- GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED5
- OSTimeDlyHMSM(0,0,*RX_Mbox,0); //延时x秒
- GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED5
- }
- }
复制代码 工程截图
|
|