完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序运行到OSStatinit()时就不在运行了,将OSStatInit()注释掉后每个任务都只运行一次后就不再运行了,但是这两种情况下,卡主后都还能响应中断,不知道是怎么回事?
这个程序的目的就是:通过按键0,1进入中断,在中断中向SW任务(sw_task)发送消息,SW根据消息来挂起和解挂AD采集任务(adc_task)和温度采集任务(wen_task),按键0,采集AD,按键1,采集温度。 我之前用寄存器版本移植UCOS,运行这个程序没有任何问题,现在用库函数移植UCOS,运行这个程序就出现了这个问题,原子哥能不能帮忙看一下: main.c代码如下: #include"sys.h"#include"delay.h"#include"usart.h"#include "led.h"#include "adc.h"#include "lcd.h"#include"exti.h"#include"includes.h" //START 任务#define START_TASK_PRIO 10 //设置任务优先级#define START_STK_SIZE 512 //设置任务堆栈大小OS_STK START_TASK_STK[START_STK_SIZE]; //任务堆栈void start_task(void *pdata); //任务函数 //ADC任务#define ADC_TASK_PRIO 7 //设置任务优先级#define ADC_STK_SIZE 512 //设置任务堆栈大小OS_STK ADC_TASK_STK[ADC_STK_SIZE]; //任务堆栈void adc_task(void *pdata); //任务函数 //WEN任务#define WEN_TASK_PRIO 8 //设置任务优先级#define WEN_STK_SIZE 512 //设置任务堆栈大小OS_STK WEN_TASK_STK[WEN_STK_SIZE]; //任务堆栈void wen_task(void *pdata); //任务函数 //切换任务#define SW_TASK_PRIO 5 //设置任务优先级#define SW_STK_SIZE 512 //设置任务堆栈大小OS_STK SW_TASK_STK[SW_STK_SIZE]; //任务堆栈void sw_task(void *pdata); //任务函数 //CPU利用率显示#define CPU_TASK_PRIO 9 //设置任务优先级#define CPU_STK_SIZE 512 //设置任务堆栈大小OS_STK CPU_TASK_STK[CPU_STK_SIZE]; //任务堆栈void cpu_task(void *pdata); //任务函数 OS_EVENT *myMBox;//消息邮箱 #define READ_TIMES 40 //一次读取ADC数据的个数#define LOST_VAL 3//去掉最大值和最小值的个数 int main(void){ NVIC_Configuration();delay_init(); //延时初始化uart_init(9600); //串口初始化为9600LED_Init(); //初始化LEDLCD_Init();Adc_Init();EXTIX_Init();OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务OSStart(); } void start_task(void *pdata){ u8 err;OS_CPU_SR cpu_sr=0;pdata = pdata;POINT_COLOR=BRED;//设置字体为红色LCD_ShowString(100,90,"CPU: 00 %"); POINT_COLOR=BLUE;//设置字体为蓝色LCD_ShowString(60,130,"ADC_CH0_VAL:"); LCD_ShowString(60,150,"ADC_CH0_VOL:0.000V");LCD_ShowString(60,170,"TEMP_VAL:"); LCD_ShowString(60,190,"TEMP_VOL:0.000V"); LCD_ShowString(60,210,"TEMPERATE:00.00C");myMBox=OSMboxCreate((void*)0);//创建消息邮箱OSStatInit();//初始化统计任务.这里会延时1秒钟左右,若要使用统计任务必须调用该函数 OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) OSTaskCreate(sw_task,(void *)0,(OS_STK*)&SW_TASK_STK[SW_STK_SIZE-1],SW_TASK_PRIO);OSTaskCreate(adc_task,(void *)0,(OS_STK*)&ADC_TASK_STK[ADC_STK_SIZE-1],ADC_TASK_PRIO); OSTaskCreate(wen_task,(void *)0,(OS_STK*)&WEN_TASK_STK[WEN_STK_SIZE-1],WEN_TASK_PRIO);OSTaskCreate(cpu_task,(void *)0,(OS_STK*)&CPU_TASK_STK[CPU_STK_SIZE-1],CPU_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO);//挂起起始任务.OS_EXIT_CRITICAL();//退出临界区(可以被中断打断)} void sw_task(void *pdata){u8 bz1=0;u8 bz2=0;LCD_ShowString(110,70,"START");while(1){u32 *sign;u8 err;sign=(u32*)OSMboxPend(myMBox,0,&err);switch(*sign){case 1:bz1=!bz1;if(bz1){OSTaskSuspend(ADC_TASK_PRIO);}else{OSTaskResume(ADC_TASK_PRIO);}break;case 2:bz2=!bz2;if(bz2){OSTaskSuspend(WEN_TASK_PRIO);}else{OSTaskResume(WEN_TASK_PRIO);}break;}OSTimeDly(10);}} void adc_task(void *pdata){ while(1){u8 i,j;u16 adc[READ_TIMES]; //数组用于保存AD的值u16 adcx=0; //AD的平均值u16 temp,temp1,temp3;float temp2;u32 sum=0;for(i=0;i ////将电压值以ASCII码发送出去//temp3=temp2; //temp2为float,temp,temp3为整型u16//temp=adcx+48;//USART1->DR=temp;//发送整数位ASCII码//while((USART1->SR&0X40)==0);//等待发送结束//USART1->DR='.';//while((USART1->SR&0X40)==0);//temp1=100;//for(i=0;i<3;i++) //发送小数位ASCII码//{// temp=temp3/temp1;//USART1->DR=temp+48;//while((USART1->SR&0X40)==0);//等待发送结束//temp3=temp3%temp1;//temp1=temp1/10;//}//USART1->DR='V';//while((USART1->SR&0X40)==0);//等待发送结束//USART1->DR=' ';//while((USART1->SR&0X40)==0);//等待发送结束OSTimeDly(25);};} void wen_task(void *pdata){ while(1){u8 i,j;u16 adc[READ_TIMES]; //数组用于保存AD的值u16 adcx=0; //AD的平均值u16 temp,temp1,temp3;float temp2,temperate;u32 sum=0;LED1=!LED1;for(i=0;i void cpu_task(void *pdata){while(1){LCD_ShowNum(140,90,OSCPUUsage,2,16); //显示CPU利用率OSTimeDly(100);}} |
|
相关推荐
3个回答
|
|
回复【2楼】发烧友:
------------------------------ 可能是我系统移植的问题,我试了一下最简单的任务也只运行了几次,后面就不能运行了,但是UCOSII这个文件夹我直接用“MINISTM32 扩展实验30 UCOSII消息邮箱测试”中的UCOSII文件夹,结果还是一样,这不知道出了什么问题 |
|
|
|
直接下载我们的例程,总可以跑吧?
|
|
|
|
SYSTEM文件夹要支持UCOSII的版本的才可以,且在sys.h里面,要设置SYSTEM_SUPPORT_UCOS 为1,才行。
|
|
|
|
只有小组成员才能发言,加入小组>>
807 浏览 0 评论
1159 浏览 1 评论
2534 浏览 5 评论
2867 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2717 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1097浏览 3评论
197浏览 2评论
463浏览 2评论
377浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
458浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 21:32 , Processed in 1.063536 second(s), Total 53, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号