STM32基于UCOSII的LED实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ห้องสมุดไป่ตู้
//Com1_SEM=OSSemCreate(1); //建立串口 1 中断的信号量 Com1_MBOX=OSMboxCreate((void *) 0); //建立串口 1 中断的信号量
//串口 1 接收及发送任务--------------------------------------------------------OSTaskCreateExt(Task_Com1,(void *)0,(OS_STK *)&Task_Com1Stk[Task_Com1_STK_SIZE-1],Task_Com1_PRIO,Task_Com1_PRIO,(OS_STK *)&Task_Com1Stk[0], Task_Com1_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //LED1 闪烁任务-----------------------------------------------------OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0], Task_Led1_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //LED2 闪烁任务-----------------------------------------------------OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0], Task_Led2_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //LED3 闪烁任务-----------------------------------------------------OSTaskCreateExt(Task_Led3,(void *)0,(OS_STK *)&Task_Led3Stk[Task_Led3_STK_SIZE-1],Task_Led3_PRIO,Task_Led3_PRIO,(OS_STK *)&Task_Led3Stk[0], Task_Led3_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); } **************主函数************************** int main(void) { //禁止 CPU 中断 CPU_IntDis(); //UCOS 初始化 OSInit(); //硬件平台初始化 BSP_Init();
{ //1 秒一次循环 OSTimeDlyHMSM(0, 0,1, 0); } } //LED1 闪烁任务---------------------------------------static void Task_Led1(void* p_arg) {
(void) p_arg; while (1) { LED_LED1_ON(); OSTimeDlyHMSM(0, 0, 0, milsec1); LED_LED1_OFF(); OSTimeDlyHMSM(0, 0, 0, milsec1); } } //LED2 闪烁任务---------------------------------------static void Task_Led2(void* p_arg) {
(void) p_arg; while (1) {
LED_LED3_ON(); OSTimeDlyHMSM(0, 0, 0, milsec3); LED_LED3_OFF(); OSTimeDlyHMSM(0, 0, 0, milsec3); } } //++++++++++++COM1 处理任务++++++++++++++++++++++++++ static void Task_Com1(void *p_arg){ INT8U err; char * msg; (void)p_arg; while(1){ //OSSemPend(Com1_SEM,0,&err); //等待串口接收指令成功的信号量 msg=(char *)OSMboxPend(Com1_MBOX,0,&err); //等待串口接收指令成功的信号量 USART_OUT(USART1,&TxBuffer1[0]); if(msg[0]=='L'&&msg[1]==0x31){ milsec1=atoi(&msg[3]); //LED1 的延时毫秒 (mini and V3) USART_OUT(USART1,"\r\n"); USART_OUT(USART1,"LED1: %d ms 间隔闪烁",milsec1); } else if(msg[0]=='L'&&msg[1]==0x32){ milsec2=atoi(&msg[3]); //LED2 的延时毫秒 (only V3) USART_OUT(USART1,"\r\n"); USART_OUT(USART1,"LED2: %d ms 间隔闪烁",milsec2); } else if(msg[0]=='L'&&msg[1]==0x33){ milsec3=atoi(&msg[3]); //LED3 的延时毫秒 (only V3) USART_OUT(USART1,"\r\n"); USART_OUT(USART1,"LED3: %d ms 间隔闪烁",milsec3); } } } static void App_TaskCreate(void) {
//向串口 1 发送开机字符。 USART_OUT(USART1,"***************************************************\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 奋斗版 STM32 开发板基于 uCOSII2.86 实验 *\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 1-LED1: %d ms 间隔闪烁 *\r\n",milsec1); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 2-LED2: %d ms 间隔闪烁 *\r\n",milsec2); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 3-LED3: %d ms 间隔闪烁 *\r\n",milsec3); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 4-串口输出,USART1-115200 波特率 *\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 中国广东省深圳市南山区西丽镇孟亮-泡桐树 *\r\n"); USART_OUT(USART1,"* Email:mengliangworld@ QQ252488010 *\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"***************************************************\r\n"); USART_OUT(USART1,"\r\n"); //建立主任务,优先级最高 建立这个任务另外一个用途是为了以后使用统计任务 os_err = OSTaskCreate((void (*) (void *)) App_TaskStart, (void *) 0, (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], (INT8U) APP_TASK_START_PRIO); //ucos 的节拍计数器清 0 497 天就重新计数 OSTimeSet(0); OSStart(); 节拍计数器是 0-4294967295 对于节拍频率 100hz 时, 每隔
继做了初探 UCOSII 简单的工程建立移植实验后, 继续进行第 20 个实验-基于 UCOSII 的 LED 实验 本例程操作系统采用 ucos2.86a 版本, 建立了 5 个任务 任务名 优先级 APP_TASK_START_PRIO 2 主任务 Task_Com1_PRIO 4 COM1 通信任务 Task_Led1_PRIO 7 LED1 闪烁任务 Task_Led2_PRIO 8 LED2 闪烁任务 Task_Led3_PRIO 9 LED3 闪烁任务 当然还包含了系统任务: OS_TaskIdle 空闲任务-----------------优先级最低 OS_TaskStat 统计运行时间的任务-------优先级次低 主要函数如下---**************************************************************** * App_TaskStart() * * Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking starts. * * Argument : p_arg Argument passed to 'App_TaskStart()' by 'OSTaskCreate()'. * * Return : none. * * Caller : This is a task. * * Note : none. ******************************************************************************* ************************** */ static void App_TaskStart(void* p_arg) {
(void) p_arg; while (1) { LED_LED2_ON(); OSTimeDlyHMSM(0, 0, 0, milsec2); LED_LED2_OFF(); OSTimeDlyHMSM(0, 0, 0, milsec2); } } //LED3 闪烁任务---------------------------------------static void Task_Led3(void* p_arg) {
(void) p_arg; //初始化 ucos 时钟节拍 OS_CPU_SysTickInit(); //使能 ucos 的统计任务 #if (OS_TASK_STAT_EN > 0) //----统计任务初始化函数 OSStatInit(); #endif //建立其他的任务 App_TaskCreate(); while (1)
return (0); } ***************************************************************** 演示结果如下:
12.19 修改后的结果演示-
//Com1_SEM=OSSemCreate(1); //建立串口 1 中断的信号量 Com1_MBOX=OSMboxCreate((void *) 0); //建立串口 1 中断的信号量
//串口 1 接收及发送任务--------------------------------------------------------OSTaskCreateExt(Task_Com1,(void *)0,(OS_STK *)&Task_Com1Stk[Task_Com1_STK_SIZE-1],Task_Com1_PRIO,Task_Com1_PRIO,(OS_STK *)&Task_Com1Stk[0], Task_Com1_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //LED1 闪烁任务-----------------------------------------------------OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0], Task_Led1_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //LED2 闪烁任务-----------------------------------------------------OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0], Task_Led2_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //LED3 闪烁任务-----------------------------------------------------OSTaskCreateExt(Task_Led3,(void *)0,(OS_STK *)&Task_Led3Stk[Task_Led3_STK_SIZE-1],Task_Led3_PRIO,Task_Led3_PRIO,(OS_STK *)&Task_Led3Stk[0], Task_Led3_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); } **************主函数************************** int main(void) { //禁止 CPU 中断 CPU_IntDis(); //UCOS 初始化 OSInit(); //硬件平台初始化 BSP_Init();
{ //1 秒一次循环 OSTimeDlyHMSM(0, 0,1, 0); } } //LED1 闪烁任务---------------------------------------static void Task_Led1(void* p_arg) {
(void) p_arg; while (1) { LED_LED1_ON(); OSTimeDlyHMSM(0, 0, 0, milsec1); LED_LED1_OFF(); OSTimeDlyHMSM(0, 0, 0, milsec1); } } //LED2 闪烁任务---------------------------------------static void Task_Led2(void* p_arg) {
(void) p_arg; while (1) {
LED_LED3_ON(); OSTimeDlyHMSM(0, 0, 0, milsec3); LED_LED3_OFF(); OSTimeDlyHMSM(0, 0, 0, milsec3); } } //++++++++++++COM1 处理任务++++++++++++++++++++++++++ static void Task_Com1(void *p_arg){ INT8U err; char * msg; (void)p_arg; while(1){ //OSSemPend(Com1_SEM,0,&err); //等待串口接收指令成功的信号量 msg=(char *)OSMboxPend(Com1_MBOX,0,&err); //等待串口接收指令成功的信号量 USART_OUT(USART1,&TxBuffer1[0]); if(msg[0]=='L'&&msg[1]==0x31){ milsec1=atoi(&msg[3]); //LED1 的延时毫秒 (mini and V3) USART_OUT(USART1,"\r\n"); USART_OUT(USART1,"LED1: %d ms 间隔闪烁",milsec1); } else if(msg[0]=='L'&&msg[1]==0x32){ milsec2=atoi(&msg[3]); //LED2 的延时毫秒 (only V3) USART_OUT(USART1,"\r\n"); USART_OUT(USART1,"LED2: %d ms 间隔闪烁",milsec2); } else if(msg[0]=='L'&&msg[1]==0x33){ milsec3=atoi(&msg[3]); //LED3 的延时毫秒 (only V3) USART_OUT(USART1,"\r\n"); USART_OUT(USART1,"LED3: %d ms 间隔闪烁",milsec3); } } } static void App_TaskCreate(void) {
//向串口 1 发送开机字符。 USART_OUT(USART1,"***************************************************\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 奋斗版 STM32 开发板基于 uCOSII2.86 实验 *\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 1-LED1: %d ms 间隔闪烁 *\r\n",milsec1); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 2-LED2: %d ms 间隔闪烁 *\r\n",milsec2); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 3-LED3: %d ms 间隔闪烁 *\r\n",milsec3); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 任务 4-串口输出,USART1-115200 波特率 *\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"* 中国广东省深圳市南山区西丽镇孟亮-泡桐树 *\r\n"); USART_OUT(USART1,"* Email:mengliangworld@ QQ252488010 *\r\n"); USART_OUT(USART1,"* *\r\n"); USART_OUT(USART1,"***************************************************\r\n"); USART_OUT(USART1,"\r\n"); //建立主任务,优先级最高 建立这个任务另外一个用途是为了以后使用统计任务 os_err = OSTaskCreate((void (*) (void *)) App_TaskStart, (void *) 0, (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], (INT8U) APP_TASK_START_PRIO); //ucos 的节拍计数器清 0 497 天就重新计数 OSTimeSet(0); OSStart(); 节拍计数器是 0-4294967295 对于节拍频率 100hz 时, 每隔
继做了初探 UCOSII 简单的工程建立移植实验后, 继续进行第 20 个实验-基于 UCOSII 的 LED 实验 本例程操作系统采用 ucos2.86a 版本, 建立了 5 个任务 任务名 优先级 APP_TASK_START_PRIO 2 主任务 Task_Com1_PRIO 4 COM1 通信任务 Task_Led1_PRIO 7 LED1 闪烁任务 Task_Led2_PRIO 8 LED2 闪烁任务 Task_Led3_PRIO 9 LED3 闪烁任务 当然还包含了系统任务: OS_TaskIdle 空闲任务-----------------优先级最低 OS_TaskStat 统计运行时间的任务-------优先级次低 主要函数如下---**************************************************************** * App_TaskStart() * * Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking starts. * * Argument : p_arg Argument passed to 'App_TaskStart()' by 'OSTaskCreate()'. * * Return : none. * * Caller : This is a task. * * Note : none. ******************************************************************************* ************************** */ static void App_TaskStart(void* p_arg) {
(void) p_arg; while (1) { LED_LED2_ON(); OSTimeDlyHMSM(0, 0, 0, milsec2); LED_LED2_OFF(); OSTimeDlyHMSM(0, 0, 0, milsec2); } } //LED3 闪烁任务---------------------------------------static void Task_Led3(void* p_arg) {
(void) p_arg; //初始化 ucos 时钟节拍 OS_CPU_SysTickInit(); //使能 ucos 的统计任务 #if (OS_TASK_STAT_EN > 0) //----统计任务初始化函数 OSStatInit(); #endif //建立其他的任务 App_TaskCreate(); while (1)
return (0); } ***************************************************************** 演示结果如下:
12.19 修改后的结果演示-