你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

刚刚学习ucosII操作系统遇到的未知原因的难题,求高手解答

[复制链接]
hwluo 提问时间:2018-9-20 20:51 /
本人玩了半年的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;
                        }   
}                                                                        
收藏 评论4 发布时间:2018-9-20 20:51

举报

4个回答
七哥 回答时间:2018-9-21 09:11:32
你可以把ucos ii去掉,其余代码不变,跑裸机。
看看能不能正常初始化,有没有死机。如果能够正常的话,那还是操作系统的问题;如果不正常,那么先调正常,再上os

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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对应的中断服务程序,程序就会跑到那里死掉。望对后人有所警惕,千万要注意中断服务函数的名字要跟外设对应!

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

chifen 回答时间:2018-9-24 10:00:10
Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200
你看看这两个值 ,放大点能不能解决,很多是因为分配内存不足的原因

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版