一、序言
由于最近在学习rtthread,加上恰逢国庆ICeasy商城活动白嫖了一块G0001开发板,突发奇想给G0001移植rtt,但是碍于G0001少的可怜ROM以及Flash给它移植完整版的是不可能的,这一次给他移植rtt nano (ps:最后移植的结果是成功的但是用处不大只能开一一个线程多个会溢出,因此只建议拿来练习移植,可以看看内存溢出的现象)。
二、开始移植
1、下载rtt nano keil pack,并添加到工程中。pack链接:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil
2、打开mm32g0001_it文件将
HardFault_Handler();
PendSV_Handler();
SysTick_Handler();
3个函数注释。(rtt已经定义)
3、前往bord.c文件中配置 rt_hw_board_init(void) 函数,将#error "TODO 1: OS Tick Configuration."注释并添加
SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
然后添加
#include "mm32_device.h"
#include "mm32g0001_it.h"
两个头文件。
4、添加如下函数到bord.c文件中
void SysTick_Handler()
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
5、修改#define RT_HEAP_SIZE宏定义的大小,如果没有修改的话,直接编译将会出现内存溢出,这边我试了一下大概是512的时候就是正常的或者是6×128=768也是可以的,但是的话这样的话用那个finsh串口组件的话可能也会有内存溢出的情况因此建议将
#define RT_HEAP_SIZE (6*128)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void)
{
return rt_heap;
}
RT_WEAK void *rt_heap_end_get(void)
{
return rt_heap + RT_HEAP_SIZE;
}
全部注释替换为:
#define G0001_SRAM1_START (0x20000000)
#define G0001_SRAM1_END (G0001_SRAM1_START + 2 * 1024) // 结束地址 = 0x20000000(基址) + 20K(RAM大小)
#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit; // RW_IRAM1,需与链接脚本中运行时域名相对应
#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif
#define HEAP_END G0001_SRAM1_END
void rt_hw_board_init(void)
{ ....
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); //修改为这个
#endif
.... }
指定系统 HEAP
的大小,使用 RAM ZI 段结尾处作为 HEAP 的起始地址(这里需检查与链接脚本是否对应),使用 RAM 的结尾地址作为 HEAP 的结尾地址,这样可以将空余RAM
全部作为动态内存 heap
使用。
6、串口移植略。。。。。。
三、参考资料
1、https://blog.csdn.net/OnlyLove_/article/details/120273430
2、https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction
四、视频
全部评论