完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题如题。在例程中修改发现可行,主要代码如下
[AppleScript] 纯文本查看 复制代码 int main(void){OS_ERR err;CPU_SR_ALLOC();delay_init(); //时钟初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置uart_init(115200); //串口初始化LED_Init(); //LED初始化LCD_Init();//LCD初始化POINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"ALIENTEK STM32F1");LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-2");LCD_ShowString(30,50,200,16,16,"Task Suspend and Resume");LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,90,200,16,16,"2015/3/19");OSInit(&err); //初始化UCOSIIIOS_CRItiCAL_ENTER();//进入临界区 //创建开始任务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);//存放该函数错误时的返回值OS_CRITICAL_EXIT();//退出临界区 OSStart(&err); //开启UCOSIII}//开始任务任务函数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#ifOS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endifOS_CRITICAL_ENTER();//进入临界区//创建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);OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);OS_CRITICAL_EXIT();//退出临界区//OSTaskDel((OS_TCB*)0,&err);//删除start_task任务自身}//task1任务函数void task1_task(void *p_arg){u8 task1_num=0;OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;POINT_COLOR = BLACK;OS_CRITICAL_ENTER();LCD_DrawRectangle(5,110,115,314); //画一个矩形LCD_DrawLine(5,130,115,130);//画线POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");OS_CRITICAL_EXIT();while(1){task1_num++;//任务1执行次数加1 注意task1_num1加到255的时候会清零!!LED0= ~LED0;printf("任务1已经执行:%d次rn",task1_num);if(task1_num==5) {OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2printf("任务1挂起了任务2!rn");}if(task1_num==10) {OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);//任务1运行10次后恢复任务2printf("任务1恢复了任务2!rn");}printf("%drn",OSStatTaskCPUUsage);LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域LCD_ShowxNum(86,111,task1_num,3,16,0x80);//显示任务执行次数OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s}}//task2任务函数void task2_task(void *p_arg){u8 task2_num=0;OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;POINT_COLOR = BLACK;OS_CRITICAL_ENTER();LCD_DrawRectangle(125,110,234,314); //画一个矩形LCD_DrawLine(125,130,234,130);//画线POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");OS_CRITICAL_EXIT();while(1){task2_num++;//任务2执行次数加1 注意task1_num2加到255的时候会清零!!LED1=~LED1;printf("任务2已经执行:%d次rn",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80); //显示任务执行次数LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s}} 但是在另一个程序中CPU使用率经串口打印,显示为0主要代码如下 [AppleScript] 纯文本查看 复制代码 int main(void) { OS_ERR err;CPU_SR_ALLOC(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(); //延时函数初始化 uart_init(500000); //串口初始化为usmart_dev.init(72);//初始化USMARTLED_Init(); //初始化与LED连接的硬件接口KEY_Init();//初始化按键MPU_Init();//初始化MPU6050TIM3_Int_Init(999,7199);//10Khz的计数频率,计数到1000为100msTIM5_Int_Init(4999,7199);WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);OSInit(&err); //初始化UCOSIIIOS_CRITICAL_ENTER(); //进入临界区//创建开始任务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);OS_CRITICAL_EXIT();//退出临界区 OSStart(&err); //开启UCOSIII } //开始任务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#ifOS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endifOS_CRITICAL_ENTER(); //进入临界区//创建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);//创建WWDG任务OSTaskCreate((OS_TCB * )&WWDGTaskTCB, (CPU_CHAR* )"WWDG task", (OS_TASK_PTR )wwdg_task, (void* )0, (OS_PRIO )WWDG_TASK_PRIO, (CPU_STK * )&WWDG_TASK_STK[0], (CPU_STK_SIZE)WWDG_TASK_SIZE/10, (CPU_STK_SIZE)WWDG_TASK_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);OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);//挂起开始任务OS_CRITICAL_EXIT(); //退出临界区//OSTaskDel((OS_TCB*)0,&err); // 删除start任务自身}//wwdg任务函数void wwdg_task(void *p_arg){OS_ERR err;CPU_SR_ALLOC();p_arg=p_arg;while(1){OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s}}//task1任务函数void task1_task(void *p_arg){u8 t=0, report=1;//默认开启上报u8 k1=0, k2=0;u8 key;short aacx_filter;OS_ERR err;CPU_SR_ALLOC();p_arg=p_arg;while(mpu_dmp_init()){printf("系统初始化中...rn");} while(1){key=KEY_Scan(0);if(key==KEY0_PRES){report=!report;}if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0){ Kalman_filter();aacx_filter= Amplitude_limit(9000,-7000,aacx);gyroz_filter=Amplitude_limit(1000,0,gyroz);aacx_filter=Sliding_average_x(aacx_filter);gyroz_filter=Sliding_average_zgry(gyroz_filter);x[k1++]=aacx_filter;z_G[k2++]=gyroz_filter;if(k1==3) k1=0;if(k2==3) k2=0;min=Min_value(aacx_filter);max=Max_value(gyroz_filter);//usart1_report_imu(aacx_filter,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));if((t%10)==0){ t=0;LED0=!LED0;//LED闪烁}}t++;printf("%drn",OSStatTaskCPUUsage);OSTaskSuspend((OS_TCB*)&Task1_TaskTCB,&err); //将Task1挂起OSTimeDlyHMSM(0,0,0,1,OS_OPT_TIME_HMSM_STRICT,&err); //延时1ms} }void task2_task(void *p_arg){OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;while(1){Moni();if(allow_nod==1){allow_nod=0;nod();}OSTaskResume((OS_TCB*)&Task1_TaskTCB,&err); //恢复Task1}} 请问这是为什么? |
|
相关推荐
2个回答
|
|
|
|
|
|
知道了,是优先级的问题
|
|
|
|
只有小组成员才能发言,加入小组>>
818 浏览 0 评论
1162 浏览 1 评论
2536 浏览 5 评论
2871 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2720 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1114浏览 3评论
198浏览 2评论
465浏览 2评论
382浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
463浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 07:05 , Processed in 1.037685 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号