本人玩了半年的32裸机,最近想往32上装上操作系统来试一下,所以就把一个ucosII移植在STM32的例程拷录到32板上,但是发现程序会在我的硬件初始化程序那里就跑死,会跑到startup_stmx_hd.s的324行的B中。针对这个问题我观察过改造例程之前与改造之后的区别是,我在硬件初始化那部分的代码会因为给4G模块发送AT指令之后触发USART2的接收中断,通过各种调试之后我觉得很有可能是这个原因导致程序跑死。 但是我左思右想觉得我硬件初始化函数在ucos系统初始化函数之前就执行,换言之,触发USART2中断的时候ucos还没初始化。这就没法说是因为触发中断而导致系统出现调度而导致的问题了。所以目前为止,就我观察到的对这个问题的现象想不出究竟是什么原因导致的,有没有高手赐教一下? int main(void) { delay_init(); //延时初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置 uart_init(115200); //串口波特率设置 LED_Init(); //LED初始化 OLED_Init(); //初始化OLED连接的引脚 OLED_Clear(); //OLED清屏函数 USART2_Init_Config(115200); SIM7600_Config(); OSInit(); //UCOS初始化 OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //创建开始任务 OSStart(); //开始任务 } void SIM7600_Config(void) { printf("SIM7600模块正在注册网络\r\n"); OLED_ShowString(15,0,"NWK searching"); //Wait_CREG(); OLED_ShowString(0,4,"CREG suc"); delay_ms(1000); OLED_Clear(); Set_ATE0();//取消回显 Connect_Server();//连接服务器 } void Wait_CREG(void) //等待模块注册函数 { u8 i; u8 k; i = 0; CLR_Buf2(); while(i == 0) { CLR_Buf2(); UART2_SendString("AT+CREG?"); UART2_SendLR(); delay_ms(500); //执行到这里程序就会跑死,不知道什么原因 for(k=0;k<Buf2_Max;k++) { if(Uart2_Buf[k] == ':') { if((Uart2_Buf[k+4] == '0')||(Uart2_Buf[k+4] == '1')) { i = 1; //UART1_SendLR(); break; } } } printf("注册中....."); } } void SIM7600_IRQHandler_Routine(void) { u8 Res=0; Res =USART_ReceiveData(USART2); Uart2_Buf[First_Int] = Res; First_Int++; if(First_Int > Buf2_Max) { First_Int = 0; } } |
看看能不能正常初始化,有没有死机。如果能够正常的话,那还是操作系统的问题;如果不正常,那么先调正常,再上os
评分
查看全部评分
评分
查看全部评分
Heap_Size EQU 0x00000200
你看看这两个值 ,放大点能不能解决,很多是因为分配内存不足的原因
评分
查看全部评分