打印
[MM32软件]

MM32操作系统移植总结

[复制链接]
44|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-2-5 10:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1. 移植过程

2.编译成功 ,烧录到单片机上,一旦调用freeRtos的API会使得单片机卡死。



原因:堆栈溢出,需按照datasheet来配置小于datasheet SARAM的的大小,能用的大小为全局变量的余量。

3.初始化时钟时一旦完成初始化会使得整个系统卡死。

void SysTick_Handler(void)  //cpu 中断来源 汇编语言编写
{
        //xPortSysTickHandler();
        static char print_cont1 ,print_cont=0;
        //test
        static uint32_t systickCount = 0;
    systickCount>645352?(systickCount=0):(systickCount++);
         if (systickCount % (8000) == 0) { // 每100次打印一次,减少日志量
        printf("SysTick Handler Called %d times\r\n", systickCount);
    }
//         
         if (Rtos_count != 0x00) {
                printf("Rtos_count %d \r\n", Rtos_count);
        Rtos_count--;
    }
       
        #if SYSTICK_MODE == USE_INTERRUPT_MODE
        if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
                if(print_cont==0)
                {
                        printf("RTOS time running...\r\n");
                        print_cont++;
                       
                }
       xPortSysTickHandler();
    }
    else
    {
                if(print_cont1==0)
                {
                        printf("snake arm running...\r\n");
                        print_cont1++;
                }
                TimingDelayDecrement();//BOARD_Delay_Decrement();
        }
        #endif
}
#endif




原因:在操作系统的任务没有被创建的时候,就开始了操作系统的心跳,该心跳会区遍历任务链表的任务。

应当怎加判断条件,在操作系统没有工作的的时候用CPU的心跳 ,在创建任务之后操作系统再去接管CPU的心跳。

4.延时函数在操作系统工作以后不能用。也会出现卡死。

打开延时函数的定义,会发现延时函数在等在一个变量减少为1,而裸机的心跳会使得变量递减,操作系统接管之后,需要重新定义延时函数。

    sTimingDelay = count;

    while(sTimingDelay != 0);
增加修改代码如下:

extern uint32_t SystemCoreClock;
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值                     
        ticks=nus*SystemCoreClock;                                                 //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };                                                                                    
}  
void delay_ms_Rtos(u32 count)
{
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值                     
        ticks=count*SystemCoreClock/2;     //ticks=count*SystemCoreClock;                                                //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };               

5.在创建的任务中。如果调用临界区,不能再使用延时函数。否则也会卡死
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_43519774/article/details/145015796

使用特权

评论回复
沙发
caigang13| | 2025-2-5 10:13 | 只看该作者
现在已经从FreeRTOS转战到国产RTThread了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2093

主题

16162

帖子

16

粉丝