[国产单片机] 【东软载波ESF0654 PDS开发板活动】移植RT-Thread到ES32F0654平台

[复制链接]
4667|25
 楼主 | 2019-12-19 10:20 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2019-12-19 10:33 编辑

准备工作:RT-Thread 源码 PWM工程。
RT-Thread Nano 源码获取, Nano 去除了各种开发板的 BSP,保留了 OS 核心功能。下载地址: https://github.com/RTThread/rt-thread下载好的 RT-Thread PackageRT-Thread Package 容量很小,我们直接将安装在 KEILPACK 目录下,然后将整个 RT-Thread 文件夹拷贝到我们的 PWM裸机工程里面。RT-Thread 文件夹目录如下:
127415dfade7dac5a6.png
BSP:板级支持包;
components/finshRT-Thread 组件;
include: 头文件;
libcpu: 与处理器相关的接口文件;
srcRT-Thread 内核源码

使用特权

评论回复
 楼主 | 2019-12-19 10:22 | 显示全部楼层
在PWM工程上新建 RT-Thread 文件夹,并在该文件夹下新建 RT-Thread-Port、RT-Thread-Source 和 RT-Thread-Include 文件夹。
605785dfadecf6aced.png

使用特权

评论回复
 楼主 | 2019-12-19 10:22 | 显示全部楼层
将 RT-Thread/3.0.3/src文件夹下的所有文件复制到新建的RT-Thread-Source文件夹中。
556955dfadeed8df28.png


使用特权

评论回复
 楼主 | 2019-12-19 10:23 | 显示全部楼层
将路径 RT-Thread/3.0.3/libcpu/arm/cortex-m0/文件夹下的context_rvds.S 文件和cpuport.c 文件复制到新建的 RT-Thread-Port 文件夹中。
497675dfadf33c7f57.png


使用特权

评论回复
 楼主 | 2019-12-19 10:24 | 显示全部楼层
将路径 RT-Thread\3.0.3\components\finsh 文件夹复制到新建的RT-Thread-Include 文件夹中,将路径 RT-Thread\3.0.3\include文件夹下的内容复制到新建的 RT-Thread-Include文件夹中。
922525dfadf4922bb5.png


使用特权

评论回复
 楼主 | 2019-12-19 10:24 | 显示全部楼层
将路径RT-Thread/3.0.3/文件夹下面的 rtconfig.hboard.c文件复制到到 user文件夹下
738975dfadf5f7f0f1.png


使用特权

评论回复
 楼主 | 2019-12-19 10:24 | 显示全部楼层
Keil 新建 RT-Thread-Source 与RT-Thread-Port 分组。
683995dfadf7395a24.png

使用特权

评论回复
 楼主 | 2019-12-19 10:26 | 显示全部楼层
向 RT-Thread-Source分组添加文件,将 RT-Thread-Source文件夹的内容全部添加进去。
542275dfadfbeed172.png

使用特权

评论回复
 楼主 | 2019-12-19 10:26 | 显示全部楼层
向 RT-Thread-Port 分组添加文件,将 RT-Thread-Port 文件夹的内容全部添加进去,不要忘记添加 context_rvds.S 文件哦!
787795dfadfd8b1b2f.png

使用特权

评论回复
 楼主 | 2019-12-19 10:26 | 显示全部楼层
向 User 分组中添加 rtconfig.h 和 board.c 文件
765335dfadfed03209.png

使用特权

评论回复
 楼主 | 2019-12-19 10:27 | 显示全部楼层
最后就是将对应的头文件添加进去,将 RT-Thread-Include 文件夹的头文件路径添加进去。
975875dfae00b99fb1.png

使用特权

评论回复
 楼主 | 2019-12-19 10:27 | 显示全部楼层
第一次尝试编译,看是否会报错,不出意料肯定很多错误,这里提示不能打开RTE_Components.h头文件
337755dfae0253a739.png

使用特权

评论回复
 楼主 | 2019-12-19 10:28 | 显示全部楼层
原因是头文件 RTE_Components.h 是在 MDK 中添加 RT-Thead Package 时由 MDK 自动生成的,目前我们没有使用 MDK 中自带的 RT-Thread 的 Package,所以这个头文件不存在,如果包含了该头文件,编译的时候会报错,需要注释掉该头文件。
389065dfae03e737e7.png

使用特权

评论回复
 楼主 | 2019-12-19 10:28 | 显示全部楼层
再次编译,就剩下3处错误了,这样看着比刚才舒服多了,哈哈!这,这个提示很简单,一看就是 irq.c和RT-Thread重复定义了中断函数
608725dfae056d5d4f.png


使用特权

评论回复
 楼主 | 2019-12-19 10:29 | 显示全部楼层
将 irq.c 文件中的对应中断函数 PendSV_Handler、 HardFault_Handler、SysTick_ HandlerSysTick_Handler 屏蔽,再次编译就不会报错了。
604965dfae0853f8b0.png
948635dfae08c9071b.png

使用特权

评论回复
 楼主 | 2019-12-19 10:30 | 显示全部楼层
修改rtconfig.h 文件, rtconfig.h 是直接从RT-Thread/3.0.3/bsp 文件夹下面拷贝过来的,该头文件对裁剪整个 RT-Thread 所需的功能的宏均做了定义,有些宏定义被使能,有些宏定义被失能,一开始我们只需要配置最简单的功能即可,要想随心所欲的配置RT-Thread 的功能,我们必须对这些宏定义的功能有所掌握。
  1. #define RT_THREAD_PRIORITY_MAX 8
  2. //表示 RT-Thread 支持多少个优先级,取值范围为 8~256,默认为 32。
  3. #define RT_TICK_PER_SECOND 1000
  4. //表示操作系统每秒钟有多少个 tick 即是操作系统的时钟周期,默认为 1000,即操作系
  5. 统的时钟周期 tick 等于 1ms。
  6. #define RT_ALIGN_SIZE 4
  7. //表示 CPU 处理的数据需要多少个字节对齐,默认为 4 个字节
  8. #define RT_NAME_MAX 8
  9. //表示内核对象名字的最大长度, 取值范围为 2~16,默认为 8。
  10. #define RT_USING_COMPONENTS_INIT
  11. //RT-Thread 组件初始化,默认使能
  12. #define RT_USING_USER_MAIN
  13. //使用用户 main 函数,默认打开
  14. #define RT_MAIN_THREAD_STACK_SIZE 512
  15. // main 线程栈大小,取值范围为 1~4086,单位为字节,默认为 512
  16. #define RT_DEBUG_INIT 0
  17. //调试配置。包括了内核调试配置,组件调试配置和线程栈溢出检测,目前全部关闭
  18. #define RT_USING_TIMER_SOFT 0
  19. //软件定时器配置,目前关闭,不使用软件定时器
  20. #define RT_USING_SEMAPHORE
  21. //内部通信配置,包括信号量、互斥量、事件、邮箱和消息队列,根据需要配置
  22. #define RT_USING_SMALL_MEM
  23. //内存管理配置
  24. #define RT_USING_CONSOLE
  25. //控制台配置。控制台即是 rt_kprintf()函数调试输出的设备,通常使用串口。
复制代码


使用特权

评论回复
 楼主 | 2019-12-19 10:30 | 显示全部楼层
修改 board.c, board.c 是直接从 RT-Thread/3.0.3/bsp 文件夹下面拷贝过来的,里面存放的是与硬件相关的初始化函数,
  1. static uint32_t _SysTick_Config(rt_uint32_t ticks)
  2. //相关的寄存器定义和初始化函数,这个是跟处理器相关的,直接使用固件库函数,将其注释
  3. void *rt_heap_begin_get(void) void *rt_heap_end_get(void)
  4. //RT-Thread 堆配置,如果同时定义了 RT_USING_USER_MAIN 和 RT_USING_HEAP 这两个宏,表示 RT-Thread 里面创建内核对象时使用动态内存分配方案。
  5. void rt_hw_board_init()
  6. //RT-Thread 启动的时候会调用一个名为 rt_hw_board_init()的函数,从函数名称我们可以知道它是用来初始化开发板硬件的,比如时钟,比如串口等。
  7. void SysTick_Handler(void)
  8. //SysTick 中断服务函数是一个非常重要的函数, RT-Thread 所有跟时间相关的事情都在里面处理
复制代码


使用特权

评论回复
 楼主 | 2019-12-19 10:31 | 显示全部楼层
user 目录下新建一个 board.h 头文件,用来包含ALD固件库和相关的头文件。内容如下:
  1. #ifndef __BOARD_H__
  2. #define __BOARD_H__
  3. //ES32F0654固件库头文件
  4. #include "es32f065x.h"
  5. #include <rtthread.h>
  6. #include "ald_cmu.h"
  7. /******************************板级驱动**********************/
  8. #include "bsp_led.h"
  9. #include "bsp_key.h"
  10. #include "bsp_uart_232.h"
  11. #include "bsp_adc.h"
  12. #include "bsp_timer0.h"
  13. #include "bsp_pwm.h"

  14. /***********************************************************/
  15. //函数声明
  16. void rt_hw_board_init(void);
  17. void SysTick_Handler(void);
  18. #include "ald_cmu.h"
  19. #endif
复制代码


使用特权

评论回复
 楼主 | 2019-12-19 10:31 | 显示全部楼层
修改board.c 中的代码,具体如下:
  1. #include "board.h"
  2. #include <rthw.h>

  3. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  4. #define RT_HEAP_SIZE 1024
  5. static uint32_t rt_heap[RT_HEAP_SIZE];        // heap default size: 4K(1024 * 4)
  6. RT_WEAK void *rt_heap_begin_get(void)
  7. {
  8.     return rt_heap;
  9. }

  10. RT_WEAK void *rt_heap_end_get(void)
  11. {
  12.     return rt_heap + RT_HEAP_SIZE;
  13. }
  14. #endif

  15. /**
  16. * This function will initial your board.
  17. */
  18. void rt_hw_board_init()
  19. {       
  20.         /* System Clock Update */
  21.         // SystemCoreClockUpdate();
  22.           ald_cmu_init();
  23.          //初始化系统时钟
  24.          ald_cmu_pll1_config(CMU_PLL1_INPUT_HRC_6, CMU_PLL1_OUTPUT_48M);
  25.          ald_cmu_clock_config(CMU_CLOCK_PLL1,48000000);
  26.          led_module_init();   //LED初始化
  27.          uart_232_module_init(115200);
  28.           
  29.     /* Call components board initial (use INIT_BOARD_EXPORT()) */
  30. #ifdef RT_USING_COMPONENTS_INIT
  31.     rt_components_board_init();
  32. #endif
  33.    
  34. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  35.         rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  36. #endif
  37.    
  38. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  39.     rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  40. #endif
  41. }

  42. void rt_hw_console_output(unsigned char *str)
  43. {
  44.    rt_enter_critical();
  45.         while(*str!= '\0')
  46.         {
  47.            if(*str == '\r')
  48.                  {
  49.                    bsp_uart_232_send(str, sizeof(str));
  50.                  }
  51.         }
  52. }

  53. void SysTick_Handler(void)
  54. {
  55.         /* enter interrupt */
  56.         rt_interrupt_enter();
  57.         rt_tick_increase();
  58.         /* leave interrupt */
  59.         rt_interrupt_leave();       
  60. }
复制代码


使用特权

评论回复
 楼主 | 2019-12-19 10:31 | 显示全部楼层
折腾了一晚上,竟然RTThread就成功移植到ES32f0654平台上了,后面会对其测试,大家期待吧!

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

在线客服 快速回复 返回顶部 返回列表