单片机学习小组
直播中

陈游斗

7年用户 1100经验值
擅长:控制/MCU
私信 关注

新手怎样开始学RTOS呢

新手怎样开始学RTOS呢?从什么地方开始学习呢?

回帖(1)

侯屏早

2022-1-27 10:15:40
一、不知道从什么地方开始学习

鉴于工作原因,使用的MCU是HT32F52352。很不幸,有点冷门,网上资料很少。
而且由于是第一次接触RTOS,所以也不知道从哪里入手。
所以首先百度了RTOS什么好的时候,搜到了威名远扬的uC/OS,大伙都在夸它,我就决定从uC/OS II开始。
第一次嘛,肯定什么都不懂,就觉得跟着视频做就对了。
所以直接在某二次元 网站上观看大佬的视频。
果不其然,基本都是STM32的。不过没关系,慢慢看。
视频一开始都是说uC/OS II厉害在哪里,我听的头头是道。我觉得很有道理,欢迎大家也去听听。
但是我看到视频中,直接从已经移植好的库里面拷贝uC/OS PORT的代码过来直接使用的时候我就蒙了。
上哪找这移植好代码?总不能自己移植吧,说是这么说,试还是得试的,结论就是自己太菜,什么都看不懂,更别说移植。

感谢大佬使我豁达开朗,决定先学习较为简单rt-thread。
所以推荐小白们,如果小白们是STM32玩家,在RTOS的学习上可以浪,有大把资源,各种视频手把手教学。
但如果小白们是的冷门的MCU玩家,在没有先有案例的情况下,还是从简单但RTOS系统开始学。
最后rt-thread在官网上的资料实在是太齐全了,而且还是中文版的,简直是小白们的天堂。
我先去啃了,大家再见。
二、LED线程

低一次上手,菜刀小试了下,写了个线程,感觉和电脑上写软件的线程差不多。

static void my_Led_change(void *param){
        OUT_PC14_XOR;
}


int my_Led_start(){
    rt_timer_t timer1 = rt_timer_create("timer1",
                             my_Led_change,
                             RT_NULL,
                             250,
                             RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
    if (timer1 != RT_NULL)
        rt_timer_start(timer1);
    return 0;
}


int main(void){
  GPIO_Configuration();
  my_Led_start();
  while (1)  {
                rt_thread_mdelay(100);
                OUT_PC15_XOR;
  }
}


三、输出配置

试了几轮。啃了写代码。发现自己看进展很慢。所以又跑去看视频(二倍速),突然发现RT-thread可以用串口接收命令从而控制线程的是否开启,所以自己摸索的话视频还是要看的。
所以需要配置串口以及rt_kprintf。
首先是rt_kprintf,rt_kprintf实际调用输出的是rt_hw_console_output,但是rt_hw_console_output是个空函数,而且它被__attribute__((weak))修饰,是个弱函数。这个的作用用自己话理解的话就是:可以直接再定义一个非弱函数的rt_hw_console_output来重写原有的rt_hw_console_output。
这个很简单的网上抄了一个丢在board.c。

void rt_hw_console_output(const char *str)
{
    /* empty console output */
        rt_enter_critical();
        while(*str != 0)
        {
                if(*str == 'n')
                {
                        HT_USART1->DR = 'r';       
                        while ((HT_USART1->SR & USART_FLAG_TXC) == 0);
                }
                HT_USART1->DR = *str++;       
                while ((HT_USART1->SR & USART_FLAG_TXC) == 0);
        }
        rt_exit_critical();
}
这里rt_enter_critical()是啥我还不知道,下轮再修改补上。
其他的感觉跟一般的重写fputc一样一样的。
然后是usart的配置,但是usart配置完初始化不可以放在main()下面,而是要放在rt_hw_board_init()下面。
原因是rt-thread在main前面已经有输出了,所以得在输出之前初始化。
然后就可以发送数据了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分