hwluo 发表于 2018-9-20 20:51:58

刚刚学习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_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 == ':')
                        {
                                if((Uart2_Buf == '0')||(Uart2_Buf == '1'))
                                {
                                        i = 1;
                                        //UART1_SendLR();
                                  break;
                                }
                        }
                }
                printf("注册中.....");
        }
}

void SIM7600_IRQHandler_Routine(void)                       
{
                        u8 Res=0;
                        Res =USART_ReceiveData(USART2);
                        Uart2_Buf = Res;       
                        First_Int++;                       
                        if(First_Int > Buf2_Max)              
                        {
                                First_Int = 0;
                        }   
}                                                                        

toofree 发表于 2018-9-21 09:11:32

你可以把ucos ii去掉,其余代码不变,跑裸机。
看看能不能正常初始化,有没有死机。如果能够正常的话,那还是操作系统的问题;如果不正常,那么先调正常,再上os

hwluo 发表于 2018-9-21 19:48:10

实际上是我已经做好了一份完整的关于一个智能家居系统的代码,那份代码在裸机上可以非常正常的跑,但是我纯粹是想提升自己的技术,所以就想学操作系统,然后给之前的智能家居系统代码上一个操作系统

hwluo 发表于 2018-9-24 09:13:23

问题已经解决,真正的原因是忘了在忘了给USART2的中断服务函数改名为USART2_IRQHandler,导致系统无法找到USART2对应的中断函数,所以跑去了startup_stmx_hd.s的324行的B中,这句汇编代码的意思其实是代表系统原来自带的默认的中断服务子程序,当找不到USART2对应的中断服务程序,程序就会跑到那里死掉。望对后人有所警惕,千万要注意中断服务函数的名字要跟外设对应!

chifen 发表于 2018-9-24 10:00:10

Stack_Size      EQU   0x00000400
Heap_Size       EQU   0x00000200
你看看这两个值 ,放大点能不能解决,很多是因为分配内存不足的原因
页: [1]
查看完整版本: 刚刚学习ucosII操作系统遇到的未知原因的难题,求高手解答