笔记

来源:互联网 发布:trine3 mac 编辑:程序博客网 时间:2024/05/16 15:05

STM32+UCOSIII系统死机

1、堆栈空间太小;

2、调度信号问题;

3、硬件问题(通讯频率);

4、数组溢出;

一般来说运行操作系统 是以下几个问题
1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决

#define TASK_IO_SIZE  300#define TASK_IO_PRIO 6OS_STK  TASK_IO_STK[TASK_IO_SIZE];

比如修改300到 1000,做开发的时候 如果ram允许,尽量大些,免的麻烦

2.数组溢出
这类问题一般在通信中,接受数据的时候,特别是长度不定的时候
比如协议为 :开始 功能码 长度 数据1 数据2 。。结束
长度决定了后面的数据多少,在分配接受缓冲的时候 ,突然来了个错误的长度比如255
但是我们分配buffer[100],只定义了100,这样数组就溢出了
所有在放数据之前要对长度进行判断是否合理,以后 如果有长度 或者索引就要想到溢出。。

3.使用了非法的指针 ,比如空指针 ,编译对的 但是运行就错了

u8 *p = null;*p = 1;

把0地址的数据强制设置为1, 不错才怪

4.使用 OS_ENTER_CRITICAL();
使用了 OS_ENTER_CRITICAL(); 却忘了OS_EXIT_CRITICAL(); 退出临界区
特别是在这个函数OS_ENTER_CRITICAL(); 调用了子函数 也有的这类情况,很容易忘记关闭的这样就造成了“死机现象”
因此如果调用的话 建议在函数中加入OS_CPU_SR cpu_sr = 0u;局部变量 在管理临界区 os的内核程序也是这么用的 ,而且要注意,临界区一般用于全局变量的写操作,时间要非常快的,任务中的变量可以不用添加 。

解决:
1、单任务测试(SHT11+NOISE_ISR)
10:49->10:56->10:59->11:00
死机

2、死机原因:mymalloc()不能分配内存。

    //NOISEu8 NOISE_Buf[20]={0};void USART2_IRQHandler(void)    {    float *temp;    char i=0;    float NOISE=0.0;    OS_ERR err;             OSIntEnter();    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //½ÓÊÕÖÐ¶Ï    {         for(i=0;i<6;i++)        {            NOISE_Buf[i] = NOISE_Buf[i+1];        }        NOISE_Buf[6]=USART_ReceiveData(USART2);        if((NOISE_Buf[0]==0x01)&&(NOISE_Buf[1]==0x03)&&(NOISE_Buf[2]==0x02))        {             NOISE=(NOISE_Buf[3]*256+NOISE_Buf[4])/10;              `////////////////////////////////`             temp = mymalloc(SRAMIN,4);//死在这儿            `///////////////////////////////`            if(temp)            {                temp[0]=NOISE;                printf("noise=%3.1f dB\r\n",NOISE);                OSQPost((OS_Q*      )&NOISE_Msg,                                        (void*      )temp,                                (OS_MSG_SIZE)4,                                (OS_OPT     )OS_OPT_POST_FIFO,                                (OS_ERR*    )&err);                if(err != OS_ERR_NONE)                {                    myfree(SRAMIN,temp);                }                               }            if(err != OS_ERR_NONE)            {                myfree(SRAMIN,temp);            }        }   }       OSIntExit();                                             } 

ISR中断进去一直分配内存知道分配完内部内存池。死在mymalloc()函数。

原创粉丝点击