函数CPU_SR_ALLOC()

本文解析了函数CPU_SR_ALLOC()的作用,它是为CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT()申请一个变量,用于创建临界代码段,防止编译器警告。深入探讨了其在实时操作系统中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.     函数CPU_SR_ALLOC()是为CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT()申请一个变量:

#define  CPU_SR_ALLOC()           CPU_SR  cpu_sr = (CPU_SR)0

这个是临界代码段,在下面一个小节有详细讲解。

2.     这样做是为了防止编译器警告。

//开始任务函数 void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //统计任务 #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间 CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //进入临界区 //创建gui任务(图形任务界面) OSTaskCreate((OS_TCB * )&GUITaskTCB, //任务控制块 (CPU_CHAR * )"gui task", //任务名字 (OS_TASK_PTR )gui_task, //任务函数 (void * )0, //传递给任务函数的参数 (OS_PRIO )GUI_TASK_PRIO, //任务优先级 (CPU_STK * )&GUI_TASK_STK[0], //任务堆栈基地址 (CPU_STK_SIZE)GUI_STK_SIZE/10, //任务堆栈深度限位 (CPU_STK_SIZE)GUI_STK_SIZE, //任务堆栈大小 (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度, (void * )0, //用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err); //存放该函数错误时的返回值 //创建Heat任务 OSTaskCreate((OS_TCB * )&HeatTCB, (CPU_CHAR * )"Heat task", (OS_TASK_PTR )heat_task, (void * )0, (OS_PRIO )HEAT_PRIO, (CPU_STK * )&HEAT_STK[0], (CPU_STK_SIZE)HEAT_STK_SIZE/10, (CPU_STK_SIZE)HEAT_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建触摸任务 OSTaskCreate((OS_TCB * )&TOUCHTASKTCB, (CPU_CHAR * )"touch task", (OS_TASK_PTR )touch_task, (void * )0, (OS_PRIO )TOUCHTASK_PRIO, (CPU_STK * )&TOUCHTASK_STK[0], (CPU_STK_SIZE)TOUCHTASK_STK_SIZE/10, (CPU_STK_SIZE)TOUCHTASK_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); #if BR_601USS_W //创建状态栏任务 OSTaskCreate((OS_TCB * )&STATUSBARTASKTCB, (CPU_CHAR * )"statusbar task", (OS_TASK_PTR )statusbar_task, (void * )0, (OS_PRIO )STATUSBARTASK_PRIO, (CPU_STK * )&STATUSBARTASK_STK[0], (CPU_STK_SIZE)STATUSBARTASK_STK_SIZE/10, (CPU_STK_SIZE)STATUSBARTASK_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); #endif OS_TaskSuspend((OS_TCB*)&HeatTCB,&err);//挂起Heat任务,当中断接收到指令恢复任务,处理完之后再挂起Heat任务,避免死循环占用CPU OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务 【开始任务不需要被挂起】 OS_CRITICAL_EXIT(); //退出临界区 }解释一下这个函数
03-12
#include "includes.h" #include "stm32f10x_gpio.h" #include "xxGpio.h" //任务优先级 #define START_TASK_PRIO 3 //任务堆栈大小 #define START_STK_SIZE 128 //任务控制块 OS_TCB StartTaskTCB; //任务堆栈 CPU_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *p_arg); #define LED0_PIN GPIO_Pin_1 // #define LED0_PORT GPIOA /* GPIOB */ #define LED0_ON() GPIO_SetLow(LED0_PORT, LED0_PIN); //0 #define LED0_OFF() GPIO_SetHigh(LED0_PORT, LED0_PIN); //0 #define LED1_PIN GPIO_Pin_2 // #define LED1_PORT GPIOA /* GPIOB */ #define LED1_ON() GPIO_SetLow(LED1_PORT, LED1_PIN); //0 #define LED1_OFF() GPIO_SetHigh(LED1_PORT, LED1_PIN); //0 #define LED2_PIN GPIO_Pin_3 // #define LED2_PORT GPIOA /* GPIOB */ #define LED2_ON() GPIO_SetLow(LED2_PORT, LED2_PIN); //0 #define LED2_OFF() GPIO_SetHigh(LED2_PORT, LED2_PIN); //0 GpioCfg_ts LED0_Cfg = { LED0_PORT, LED0_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED1_Cfg = { LED1_PORT, LED1_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED2_Cfg = { LED2_PORT, LED2_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; void LEDT_Init(void) { GPIO_Config( &LED0_Cfg ); GPIO_Config( &LED1_Cfg ); GPIO_Config( &LED2_Cfg ); } OS_Q DATA_Msg; //定义一个消息队列,用于发送数据 //主函数 int main(void) { OS_ERR err; CPU_SR_ALLOC(); LEDT_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置 OSInit(&err); /* Init uC/OS-III. */ //创建开始任务 OSTaskCreate( (OS_TCB * )&StartTaskTCB, //任务控制块 (CPU_CHAR * )"start task", //任务名字 (OS_TASK_PTR )start_task, //任务函数 (void * )0, //传递给任务函数的参数 (OS_PRIO )START_TASK_PRIO, //任务优先级 (CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址 (CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位 (CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小 (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度, (void * )0, //用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err); //存放该函数错误时的返 OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */ } /****************************************************************************************** * * 实验(一) * *******************************************************************************************/ // 创建1个任务,任务执行完毕后自动退出 #if(0) //任务优先级 #define TASK1_TASK_PRIO 4 //任务堆栈大小 #define TASK1_STK_SIZE 128 //任务控制块 OS_TCB Task1_TaskTCB; //任务堆栈 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //任务优先级 #define TASK2_TASK_PRIO 4 //任务堆栈大小 #define TASK2_STK_SIZE 128 //任务控制块 OS_TCB Task2_TaskTCB; //任务堆栈 CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; void task2_task(void *p_arg); //开始任务任务函数 void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //删除start_task任务自身 // OSTaskDel( (OS_TCB*)0, &err ); } //task1任务函数 volatile uint32_t i; uint8_t LedStates = 1; void task1_task(void *p_arg) { OS_ERR err; uint8_t count = 10; while(1) { // 任务1正常运行时LED0闪烁 for(uint8_t count = 0; count < 5; count++) { LED0_ON(); for(i = 0; i < 200000; i++); // 简单延时 LED0_OFF(); for(i = 0; i < 200000; i++); // 简单延时 } // 挂起任务2(LED1将停止闪烁) OSTaskSuspend(&Task2_TaskTCB, &err); OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err); // 延时2秒 // 唤醒任务2(LED1恢复闪烁) OSTaskResume(&Task2_TaskTCB, &err); OSTimeDlyHMSM(0, 0, 3, 0, OS_OPT_TIME_DLY, &err); // 延时3秒 // 删除任务2 OSTaskDel(&Task2_TaskTCB, &err); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); // 延时1秒 // 删除任务1自身 OSTaskDel((OS_TCB*)0, &err); } } //task2任务函数 void task2_task(void *p_arg) { volatile uint32_t i; while(1) { // LED1持续闪烁 LED1_ON(); for(i = 0; i < 200000; i++); // 简单延时 LED1_OFF(); for(i = 0; i < 200000; i++); // 简单延时 // 让出CPU时间 OSTimeDly(1, OS_OPT_TIME_DLY, NULL); } } #endif /****************************************************************************************** * * 实验(二) * *******************************************************************************************/ // 创建1个任务,任务执行完毕后自动退出 #if(0) //任务优先级 #define TASK1_TASK_PRIO 4 //任务堆栈大小 #define TASK1_STK_SIZE 128 //任务控制块 OS_TCB Task1_TaskTCB; //任务堆栈 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //任务优先级 #define TASK2_TASK_PRIO 4 //任务堆栈大小 #define TASK2_STK_SIZE 128 //任务控制块 OS_TCB Task2_TaskTCB; //任务堆栈 CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; void task2_task(void *p_arg); //任务优先级 #define TASK3_TASK_PRIO 4 //任务堆栈大小 #define TASK3_STK_SIZE 128 //任务控制块 OS_TCB Task3_TaskTCB; //任务堆栈 CPU_STK TASK3_TASK_STK[TASK3_STK_SIZE]; void task3_task(void *p_arg); // 信号量定义 OS_SEM SharedResourceSem; // 共享资源信号量 OS_SEM SyncSem; // 同步信号量 //开始任务任务函数 void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK3任务 OSTaskCreate((OS_TCB * )&Task3_TaskTCB, (CPU_CHAR * )"Task3 task", (OS_TASK_PTR )task3_task, (void * )0, (OS_PRIO )TASK3_TASK_PRIO, (CPU_STK * )&TASK3_TASK_STK[0], (CPU_STK_SIZE)TASK3_STK_SIZE/10, (CPU_STK_SIZE)TASK3_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //删除start_task任务自身 // OSTaskDel( (OS_TCB*)0, &err ); } // 低优先级任务函数 void task1_task(void *p_arg) { OS_ERR err; while(1) { // 获取共享资源信号量(第一次信号量接收) OSSemPend(&SharedResourceSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 模拟处理共享资源(长时间操作) OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err); // 延时2秒 // 发送同步信号量(第一次信号量发送) OSSemPost(&SyncSem, OS_OPT_POST_1, &err); // 释放共享资源信号量 OSSemPost(&SharedResourceSem, OS_OPT_POST_1, &err); OSTimeDlyHMSM(0, 0, 5, 0, OS_OPT_TIME_DLY, &err); // 延时5秒 } } // 中优先级任务函数 void task2_task(void *p_arg) { OS_ERR err; while(1) { // 执行不需要共享资源的操作 // 这个任务会抢占低优先级任务 OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err); // 延时1秒 } } // 高优先级任务函数 void task3_task(void *p_arg) { OS_ERR err; while(1) { // 等待同步信号量(第二次信号量接收) OSSemPend(&SyncSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 获取共享资源信号量(第二次信号量接收) OSSemPend(&SharedResourceSem, 0, OS_OPT_PEND_BLOCKING, 0, &err); // 执行关键操作 // 这里应该快速完成... // 发送同步信号量(第二次信号量发送) OSSemPost(&SyncSem, OS_OPT_POST_1, &err); // 释放共享资源信号量 OSSemPost(&SharedResourceSem, OS_OPT_POST_1, &err); OSTimeDlyHMSM(0, 0, 5, 0, OS_OPT_TIME_DLY, &err); // 延时5秒 } } #endif /****************************************************************************************** * * 实验(二) * *******************************************************************************************/ // 创建1个任务,任务执行完毕后自动退出 #if(1) //任务优先级 #define TASK1_TASK_PRIO 4 //任务堆栈大小 #define TASK1_STK_SIZE 128 //任务控制块 OS_TCB Task1_TaskTCB; //任务堆栈 CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //任务优先级 #define TASK2_TASK_PRIO 4 //任务堆栈大小 #define TASK2_STK_SIZE 128 //任务控制块 OS_TCB Task2_TaskTCB; //任务堆栈 CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; void task2_task(void *p_arg); //任务优先级 #define TASK3_TASK_PRIO 4 //任务堆栈大小 #define TASK3_STK_SIZE 128 //任务控制块 OS_TCB Task3_TaskTCB; //任务堆栈 CPU_STK TASK3_TASK_STK[TASK3_STK_SIZE]; void task3_task(void *p_arg); // 信号量定义 OS_SEM SharedResourceSem; // 共享资源信号量 OS_SEM SyncSem; // 同步信号量 //开始任务任务函数 void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"Task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK3任务 OSTaskCreate((OS_TCB * )&Task3_TaskTCB, (CPU_CHAR * )"Task3 task", (OS_TASK_PTR )task3_task, (void * )0, (OS_PRIO )TASK3_TASK_PRIO, (CPU_STK * )&TASK3_TASK_STK[0], (CPU_STK_SIZE)TASK3_STK_SIZE/10, (CPU_STK_SIZE)TASK3_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //删除start_task任务自身 // OSTaskDel( (OS_TCB*)0, &err ); } #endif   帮我生成一个UCOSⅢ消息实验代码 任务要求:设计一个消息发送、接收例程,必须包含消息发送和接收,且接收消息后必须对消息长度和数据进行处理。共三个任务。
06-23
帮我生成一个UCOSⅢ任务实验代码。 任务要求:实现任务创建、挂起、唤醒及删除,必须至少包含任务创建、挂起、唤醒及删除4个元素。#include "includes.h" #include "stm32f10x_gpio.h" #include "xxGpio.h" //ÈÎÎñÓÅÏȼ¶ #define START_TASK_PRIO 3 //ÈÎÎñ¶ÑÕ»´óС #define START_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB StartTaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK START_TASK_STK[START_STK_SIZE]; //ÈÎÎñº¯Êý void start_task(void *p_arg); #define LED0_PIN GPIO_Pin_13 // #define LED0_PORT GPIOC /* GPIOB */ #define LED0_ON() GPIO_SetLow(LED0_PORT, LED0_PIN); //0 #define LED0_OFF() GPIO_SetHigh(LED0_PORT, LED0_PIN); //0 #define LED1_PIN GPIO_Pin_11 // #define LED1_PORT GPIOB /* GPIOB */ #define LED1_ON() GPIO_SetLow(LED1_PORT, LED1_PIN); //0 #define LED1_OFF() GPIO_SetHigh(LED1_PORT, LED1_PIN); //0 GpioCfg_ts LED0_Cfg = { LED0_PORT, LED0_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; GpioCfg_ts LED1_Cfg = { LED1_PORT, LED1_PIN, GPIO_Mode_Out_PP, GPIO_Speed_50MHz, Level_High, }; void LEDT_Init(void) { GPIO_Config( &LED0_Cfg ); GPIO_Config( &LED1_Cfg ); } OS_Q DATA_Msg; //¶¨ÒåÒ»¸öÏûÏ¢¶ÓÁУ¬ÓÃÓÚ·¢ËÍÊý¾Ý //Ö÷º¯Êý int main(void) { OS_ERR err; CPU_SR_ALLOC(); LEDT_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖжϷÖ×éÅäÖà OSInit(&err); /* Init uC/OS-III. */ //´´½¨¿ªÊ¼ÈÎÎñ OSTaskCreate( (OS_TCB * )&StartTaskTCB, //ÈÎÎñ¿ØÖÆ¿é (CPU_CHAR * )"start task", //ÈÎÎñÃû×Ö (OS_TASK_PTR )start_task, //ÈÎÎñº¯Êý (void * )0, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (OS_PRIO )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶ (CPU_STK * )&START_TASK_STK[0], //ÈÎÎñ¶ÑÕ»»ùµØÖ· (CPU_STK_SIZE)START_STK_SIZE/10, //ÈÎÎñ¶ÑÕ»Éî¶ÈÏÞλ (CPU_STK_SIZE)START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (OS_MSG_QTY )0, //ÈÎÎñÄÚ²¿ÏûÏ¢¶ÓÁÐÄܹ»½ÓÊÕµÄ×î´óÏûÏ¢ÊýÄ¿,Ϊ0ʱ½ûÖ¹½ÓÊÕÏûÏ¢ (OS_TICK )0, //µ±Ê¹ÄÜʱ¼äƬÂÖתʱµÄʱ¼äƬ³¤¶È£¬Îª0ʱΪĬÈϳ¤¶È£¬ (void * )0, //Óû§²¹³äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */ } /****************************************************************************************** * * ʵÑ飺ÈÎÎñ´´½¨ Óë Ö´ÐÐÍê±Ï * *******************************************************************************************/ // ´´½¨1¸öÈÎÎñ£¬ÈÎÎñÖ´ÐÐÍê±Ïºó×Ô¶¯Í˳ö #if(1) //ÈÎÎñÓÅÏȼ¶ #define TASK1_TASK_PRIO 4 //ÈÎÎñ¶ÑÕ»´óС #define TASK1_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task1_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); //¿ªÊ¼ÈÎÎñÈÎÎñº¯Êý void start_task(void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; /* Determine nbr SysTick increments */ OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ // Mem_Init(); /* Initialize Memory Management Module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif CPU_IntDisMeasMaxCurReset(); #if OS_CFG_SCHED_ROUND_ROBIN_EN //µ±Ê¹ÓÃʱ¼äƬÂÖתµÄʱºò //ʹÄÜʱ¼äƬÂÖתµ÷¶È¹¦ÄÜ,ʱ¼äƬ³¤¶ÈΪ1¸öϵͳʱÖÓ½ÚÅÄ£¬¼È1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif //´´½¨TASK1ÈÎÎñ OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //ɾ³ýstart_taskÈÎÎñ×ÔÉí // OSTaskDel( (OS_TCB*)0, &err ); } //task1ÈÎÎñº¯Êý volatile uint32_t i; uint8_t LedStates = 1; void task1_task(void *p_arg) { OS_ERR err; uint8_t count = 10; while( count-- ){ LED0_ON(); LED1_ON(); for( i = 0; i < 200000; i++ ) { i++; } LED0_OFF(); LED1_OFF(); for( i = 0; i < 200000; i++ ) { i++; } } } #endif 在这基础上修改实现,要求利用两个LED灯,两个任务
06-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值