刚刚开始学ucosII操作系统的新手遇到程序跑死的问题,经过各种调试还是没找到真正的问题,望高手赐教,急

jacket_ 2018-09-20 08:43:04
本人玩了半年的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;
}
}
...全文
567 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacket_ 2018-09-22
  • 打赏
  • 举报
回复
谢谢师兄,原来是我之前往UCOSII移植之前写好的程序的时候没注意中断服务函数的名字有变动,原来是void SIM7600_IRQHandler_Routine(void) ,但是USART2的中断服务函数名称应该是void USART2_IRQHandler(void),导致系统找不到USART2的中断服务函数而跑入startup_stmx_hd.s的324行是【B .】,这里应该这样修改,在stm32f10x_it.c中写入

void USART2_IRQHandler(void)
{
SIM7600_IRQHandler_Routine();
}
问题就可以彻底解决了。
几罗星人 2018-09-22
  • 打赏
  • 举报
回复
结贴比分吧,唔好以为系师弟就可以侧侧博,唔多觉
几罗星人 2018-09-22
  • 打赏
  • 举报
回复 1
startup_stmx_hd.s的324行是【B .】,前面321行是Default_Handler PROC,也就是默认中断服务函数,所有默认中断服务函数都共用324这一句代码,代表无条件转跳到当前的指令,也就相当于是C语言的while(1);

所以很明显,楼主没写或者写错了中断服务函数,导致进入了默认的中断服务函数,而默认的中断服务函数就是死循环,所以死在那里了。
Votangroom 2018-09-21
  • 打赏
  • 举报
回复
跳转到哪个中断处理函数里了?

是从哪句跳转过去的?

仔细调试看一下,然后百度一般都能解决

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧