一路向北lm 发表于 2020-5-3 18:00

将路径RT-Thread/3.1.3/bsp文件夹下面的 rtconfig.h和 board.c文件复制到到 user文件夹下

一路向北lm 发表于 2020-5-3 22:20

Keil MDK 新建 RT-Thread-Source 与RT-Thread-Port 分组。

一路向北lm 发表于 2020-5-3 22:21

向RT-Thread-Source分组添加文件,将 RT-Thread-Source文件夹的内容全部添加进去, 向 RT-Thread-Port 分组添加文件,将 RT-Thread-Port 文件夹的内容全部添加进去,不要忘记添加context_rvds.S 文件哦!

一路向北lm 发表于 2020-5-3 22:23

向 User 分组中添加 rtconfig.h 和 board.c 文件

一路向北lm 发表于 2020-5-3 22:24

最后就是将对应的头文件添加进去,将 RT-Thread-Include 文件夹的头文件路径添加进去。

一路向北lm 发表于 2020-5-3 22:25

第一次尝试编译,看是否会报错,不出意料肯定很多错误, 这里提示不能打开RTE_Components.h头文件,

一路向北lm 发表于 2020-5-3 22:26

原因是头文件 RTE_Components.h 是在 MDK 中添加 RT-Thead Package 时由 MDK 自动生成的,目前我们没有使用 MDK 中自带的 RT-Thread 的 Package,所以这个头文件不存在,如果包含了该头文件,编译的时候会报错,需要注释掉该头文件。

一路向北lm 发表于 2020-5-3 22:27

再次编译,提示SystickHandler 函数重复定义,注释或者删除delay.c中的中断函数,使用RT-Thread的中断函数。

一路向北lm 发表于 2020-5-3 22:28

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


一路向北lm 发表于 2020-5-3 22:28

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


一路向北lm 发表于 2020-5-3 22:29

在 user 目录下新建一个 board.h 头文件,用来包含ALD固件库和相关的头文件。内容如下:#ifndef __BOARD_H__

#define __BOARD_H__

//MM32L0 HAL固件库头文件

#include "mm32_device.h"

#include "hal_conf.h"

#include <rtthread.h>

/******************************板级驱动**********************/

#include "bsp_led.h"

#include "bsp_uart2.h"





/***********************************************************/

//函数声明

void rt_hw_board_init(void);

void SysTick_Handler(void);

#include "ald_cmu.h"

#endif


一路向北lm 发表于 2020-5-3 22:29

修改board.c 中的代码,具体如下:#include "board.h"
#include <rthw.h>

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE 1024
static uint32_t rt_heap;        // heap default size: 4K(1024 * 4)
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;
}
#endif

/**
* This function will initial your board.
*/
void rt_hw_board_init()
{       
        /* System Clock Update */
        // SystemCoreClockUpdate();
       

       //初始化系统时钟
          
    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
   
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
        rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
   
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

void SysTick_Handler(void)
{
        /* enter interrupt */
        rt_interrupt_enter();
        rt_tick_increase();
        /* leave interrupt */
        rt_interrupt_leave();       
}


一路向北lm 发表于 2020-5-3 22:29

折腾了一晚上,竟然RTThread就成功移植到MM32L0平台上了,后面会对其测试,大家期待吧!

一路向北lm 发表于 2020-5-3 22:33

4.测试RT-Thread 的kprintf创建线程任务1,实现对LED的翻转操作,其中还加入了rt_kprintf打印功能,main.c的具体代码如下:#include "board.h"
#include "rtthread.h"
struct rt_thread led0_thread;
rt_uint8_t rt_led0_thread_stack;
void task1(void *parameter);
int main()
{
rt_kprintf("The Project is ES32F0654 RT-Thread Demo.........\r\n");       
rt_thread_init(&led0_thread,"led0",
                       task1,RT_NULL,&rt_led0_thread_stack,
                       sizeof(rt_led0_thread_stack),3,20);
rt_thread_startup(&led0_thread);       
}

void task1(void *parameter)
{
        while(1)
        {
                LED1_TOGGLE();
                rt_thread_delay(500);       
                rt_kprintf("LED1_Thread running.........\r\n");       
        }
}





一路向北lm 发表于 2020-5-3 22:34

在Board.c中需要对串口USART2进行初始化操作。

一路向北lm 发表于 2020-5-3 22:35

添加重映串口控制台到rt_kprintf,具体代码如下:void rt_hw_console_output(const char *str)
{
rt_enter_critical();
        while(*str!= '\0')
        {
           if(*str == '\n')
               {
                          UART_SendData(UART2, '\r');
while(!UART_GetFlagStatus(UART2, UART_FLAG_TXEPT));
               }
                  UART_SendData(UART2, *str++);
                  while(!UART_GetFlagStatus(UART2, UART_FLAG_TXEPT));
        }
        rt_exit_critical();
}


一路向北lm 发表于 2020-5-3 22:35

烧写代码测试:串口打印出线程的信息,同时LED1在循环闪烁。RT-Thread基于MM32L0 Demo基本完成!

simonliu009 发表于 2020-5-4 09:36

支持,很详细。
不过你为啥用`&rt_led0_thread_stack`而不是用`rt_led0_thread_stack`

一路向北lm 发表于 2020-5-4 14:54

simonliu009 发表于 2020-5-4 09:36
支持,很详细。
不过你为啥用`&rt_led0_thread_stack`而不是用`rt_led0_thread_stack` ...

习惯这样用啦,都可以{:biggrin:}
页: 1 [2]
查看完整版本: 【MM32 eMiniBoard测评报告】