刚刚开始学ucosII操作系统的新手遇到程序跑死的问题,经过各种调试还是没找到真正的问题,望高手赐教,急
本人玩了半年的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;
}
}