OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4275|回复: 2

程序一直进入hardfault 的异常服务程序中,百度没解决。我试把异常服务程序的死循环去掉后又能正常运行,

[复制链接]

8

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-3-11
在线时间
75 小时
发表于 2018-5-12 19:41:32 | 显示全部楼层 |阅读模式
1金钱
任务的代码我都是在裸机跑过的,完全没问题, 到ucosii 上就GG了      调的好心累啊,求助大神

//START 任务
//设置任务优先级
#define START_TASK_PRIO                        10  ///开始任务的优先级为最低
//设置任务堆栈大小
#define START_STK_SIZE                        512
//任务任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);

//DHT11采集温湿度 任务
//设置任务优先级
#define DHT11_TASK_PRIO                5   
//设置任务堆栈大小
#define DHT11_STK_SIZE                        1024
//任务任务堆栈
OS_STK DHT11_TASK_STK[DHT11_STK_SIZE];
//任务函数
void dht11_task(void *pdata);



//设置任务优先级
#define MQ2_TASK_PRIO                6  
//设置任务堆栈大小
#define MQ2_STK_SIZE                        128
//任务任务堆栈
OS_STK MQ2_TASK_STK[MQ2_STK_SIZE];
//任务函数
void mq2_task(void *pdata);


//设置任务优先级
#define LCD_MQ2_TASK_PRIO                7   
//设置任务堆栈大小
#define LCD_MQ2_STK_SIZE                        128
//任务任务堆栈
OS_STK LCD_MQ2_TASK_STK[LCD_MQ2_STK_SIZE];
//任务函数
void lcd_mq2_task(void *pdata);


//设置任务优先级
#define WARNING_TASK_PRIO                9   
//设置任务堆栈大小
#define WARNING_STK_SIZE                        128
//任务任务堆栈
OS_STK WARNING_TASK_STK[WARNING_STK_SIZE];
//任务函数
void warning_task(void *pdata);

//火焰检测任务
//设置任务优先级
#define FIRE_TASK_PRIO                8   
//设置任务堆栈大小
#define FIRE_STK_SIZE                        128
//任务任务堆栈
OS_STK FIRE_TASK_STK[FIRE_STK_SIZE];
//任务函数
void fire_task(void *pdata);



//OS_EVENT  * MQ2_box = NULL;         //MQ2消息邮箱
//OS_FLAG_GRP *Sem_F = NULL;  //报警任务所需要的信号量集
//INT8U  err ;



int main(void)
{
        delay_init();               //延时初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
        uart_init(115200);            //串口波特率设置
        LED_Init();
        beep_init();
        fire_init();
        dht11_init();
        adc1_init();
        LCD_Init();
        POINT_COLOR=RED;
        LCD_ShowString(120,40,260,24,24,"ENVIRONMENTAL MONITOR");
  POINT_COLOR= BRRED;
        LCD_ShowString(180,110,220,24,24,"Ares Xu");       
        LCD_ShowString(100,180,220,24,24,"temperature :");
        POINT_COLOR=BLUE;
        LCD_ShowString(100,260,220,24,24,"humidity :");  
         
        LCD_ShowString(305,260,200,24,24,"% RH");  //湿度的百分号
        LCD_ShowString(295,350,200,24,24,"%");  //显示浓度的百分号
        LCD_ShowString(150,350,200,24,24,"Air  :");  //显示浓度的百分号

        LCD_ShowString(295,180,200,24,24,"C");  //显示温度单位

       
        OSInit();                                  //UCOS初始化

        OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //创建开始任务

        OSStart();                                 //开始任务
}

//开始任务
void start_task(void *pdata)
{
        OS_CPU_SR cpu_sr=0;
        pdata=pdata;
        OSStatInit();  //开启统计任务
       
        OS_ENTER_CRITICAL();  //进入临界区(关闭中断)
          
       
        OSTaskCreate(dht11_task,(void*)0,(OS_STK*)&DHT11_TASK_STK[DHT11_STK_SIZE -1],DHT11_TASK_PRIO);//创建DHT11任务
//       
//        OSTaskCreate(mq2_task,(void*)0,(OS_STK*)&MQ2_TASK_STK[MQ2_STK_SIZE-1],MQ2_TASK_PRIO);//创建MQ2气敏传感器任务
//         
//        OSTaskCreate(warning_task,(void*)0,(OS_STK*)&WARNING_TASK_STK[WARNING_STK_SIZE-1],WARNING_TASK_PRIO);//创建报警任务任务任       
//       
//        OSTaskCreate(fire_task,(void*)0,(OS_STK*)&FIRE_TASK_STK[FIRE_STK_SIZE-1],FIRE_TASK_PRIO);//创建火焰传感器检测任务
//       
//        MQ2_box = OSMboxCreate((void *) 0);  //创建MQ2邮箱
//       
//  Sem_F = OSFlagCreate((OS_FLAGS)3,&err); //创建信号量集,初始值为3(00000011)   

        OS_EXIT_CRITICAL();  //退出临界区(开中断)
}


//OS_CPU_SR cpu_sr=0;
//OS_ENTER_CRITICAL();  //进入临界区
//data_B = OSMboxPend(Dt_box,0,&err);  //申请消息邮箱
//OS_EXIT_CRITICAL();  //退出临界区
//OSTaskSuspend(OS_PRIO_SELF);
//OSTimeDlyHMSM(0,0,1,0);


void dht11_task(void *pdata)
{
        u8 temp = 0,humi = 0;
        OS_CPU_SR cpu_sr=0;
        pdata = pdata;
        for(;;)
        {
                 
                dht11_get(&temp,&humi);

                LCD_ShowNum(270,180,temp,2,24);
                LCD_ShowNum(270,260,humi,2,24);
                OSTimeDlyHMSM(0,0,1,0);
        }
}

捕获.PNG
捕4获.PNG

最佳答案

查看完整内容[请看2#楼]

仿真分析看在哪一行进入的hard fault,就好找问题了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2018-5-12 19:41:33 | 显示全部楼层
仿真分析看在哪一行进入的hard fault,就好找问题了
回复

使用道具 举报

8

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-3-11
在线时间
75 小时
 楼主| 发表于 2018-5-17 17:24:58 | 显示全部楼层
正点原子 发表于 2018-5-13 00:08
仿真分析看在哪一行进入的hard fault,就好找问题了

嗯嗯,只需要执行一遍的任务。执行完不挂起会进入hard fault异常?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 06:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表