2021-08-26 通过MDK移植RTThread nano到STM32F030C8T6


前言

音视频的坑还没填,先开一个新坑吧,去年+今年两年都没有写过博客了,以后有空还是得写写,有时候打算自己整一个博客吧,又觉得一方面可输出的内容不多,另外一方面还得考虑搜索引擎收录,想想就感觉麻烦,还是先专注内容吧。

今天想记录的是在MDK v5上面将rt-thread nano 3.1.5移植到STM32F030C8T6中,对于rt-thread来讲最好的方法其实是直接用rtthread的官方推荐IDE RT-Thread Studio 来进行开发,使用方便,出问题的概率小。但是,它默认会集成很多东西,而且我这次打算使用HAL库进行开发,所以,就并不会用到rt的finsh和device部分,虽然rt-thread studio也可以进行裁剪,但是,裁剪起来还是比较麻烦的,不如直接在MDK中只集成nano部分的核心。


一、为什么要用RTT

使用操作系统的原因无非就是移植起来方便,可以使用多线程,开发起来比较简单。目前考虑到授权方式、使用的人数,比较适合我的有两款,一款是FreeRTOS,另外一款是RTT。选择RT-Thread的原因是这款入门比较方便,国产的官方都是中文的文档,比较友好。另外一款是FreeRTOS,其实这款可能用的人数会更多,毕竟是老牌RTOS,而且还是国际化的,STM32的CubeMX里面不用安装自带它的库,以后有时间了也会记录一下研究它的过程。

二、为什么要用STM32F030C8T6

为啥子使用STM32F030C8T6?很简单,STM32F103太贵了!
真的没想到有一天买零件能和炒股似的一天一个价,没办法,所幸项目上面索要的资源也不多,换芯片呗,STM32F030C8T6和STM32F103C8T6除了有两个脚不同以外,基本上PIN2PIN对应。
对于国产的GD、HK、APM等等的替代,一方面他们的价格也吵起来了,另外一方面他们的资料比较难找,直接烧写STM32的程序又多少有些不放心。

三、官方文档

其实,官方文档写了一部分内容,网络上面好多教授移植RTT的都是直接抄的官方文档,那是一个字都没改呀,有一些倒是改动了,加了写注释,但是TMD加错了!!!毛用没有,还给人误导!!!

不过,官方可能为了让大家使用RT Thread Studio,所以写的还是比较非常模糊。

总的概括,就是先用CubeMX进行配置,主要是GPIO、RCC、DEBUG以及生成代码的地方选择MDK就可以了。写个闪灯程序,编译、检测是否可以正常通过并运行。
这方面RTT没有详细写,建议大家百度一下,后期我来补,大概会来的,对吧??

然后根据这个链接折腾 使用 MDK 移植

只需要先根据 Nano Pack 安装 这一节的内容把RT安装到MDK中,建议使用方法二。然后再根据 添加 RT-Thread Nano 到工程 这一节的内容把RT添加到工程中就OK了。接下来别跟着他折腾,按照我的来!

四、移植后的问题

1.配置

首先要按照官方的文档和代码中的提示,RTOS组下的 board.c 中添加一些适配代码,先翻到boart.c的最下面可以看到有三个TODO,主要如下:

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{
#error "TODO 1: OS Tick Configuration."
    /* 
     * TODO 1: OS Tick Configuration
     * Enable the hardware timer and call the rt_os_tick_callback function
     * periodically with the frequency RT_TICK_PER_SECOND. 
     */

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE

static int uart_init(void)
{
#error "TODO 2: Enable the hardware uart and config baudrate."
    return 0;
}
INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str)
{
#error "TODO 3: Output the string 'str' through the uart."
}

我们可以看到下面的那两个TODO是打开RT的CONSOLE才会使用,所以不必去管。现在我们就按照注释和官方文档提示进行修改:
1.删除#error
2.添加SysTick_Handler函数
3.在rt_hw_board_init下添加系统、时钟初始化、OS Tick 频率配置
修改后代码如下:

void SysTick_Handler()
{
    rt_os_tick_callback();
}

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{

  HAL_Init(); 
  SystemClock_Config(); 
  SystemCoreClockUpdate();

  SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

下面那两个TODO,我没有动,当然如果不用CONSOLE删除也没事,但是,依旧不建议删除!

2.修改

添加完成以后,会发现基本无法编译通过,会提示没有发现函数定义之类的,所以我们需要在board.c下添加头文件main.h!
然后,把main.c下面的

void SystemClock_Config(void);

声明移动到main.h中
因为在board.c中已经进行过初始化,需要将main.c中的main()函数中的

HAL_Init();
SystemClock_Config();

注释掉
在编译的时候会发现重复定义,重复定义有三个,都在stm32f0xx_it.c和stm32f0xx_it.h下,我们把他们的声明和实现都注释掉。
HardFault_Handler
PendSV_Handler
Symbol SysTick_Handler
再次编译。

3.针对STM32F030C8T6

再次编译,会发现no space的提示,这是为什么呢?
原因就是STM32F030C8T6的内存仅有8K,所以就会超出限制,那是不是STM32F030C8T6无法使用了呢?倒也不是,RTT默认会打开动态内存的选项,这个非常占用内存的,所以,我们关掉它,改用静态内存就完事!

#define RT_USING_HEAP
#define RT_USING_SMALL_MEM

注释掉!编译!编译成功,但是还有一步,暂时不要烧写!

五、测试、总结及挖坑

1.测试

我们目前只是把RTT的核心移植成功,但是从现在开始我们就必须要使用RTT的延时函数进行延时了!
将测试程序中的HAL_Delay都换成rt_thread_mdelay即可测试。

2.总结

这边文章写于8月26号,但是由于各种琐事耽搁了20天才发出来,所以我要总结什么是真的忘了

3.挖坑

1.继续挑战极限,找点RAM/ROM更小的往上移植RTT,例如STM32F030F4P6
但是RTT Nano据官方所说,最小需要3KB Flash、1.2KB RAM 内存资源,而F030F4P6的16K Flash、4K RAM,而且自己精简还未必可以精简到官方所说的那么小。所以,这个估计更多的是实验性质,在真正的项目当中,再加上项目所需要的功能,很有可能超出F4P6所拥有的资源。
2.找国产的往上移植RTT,例如GD32F103C8T6
3.找STM出来的新的型号,例如STM32G030C8T6移植RTT

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值