【RT-Thread】nxp rt10xx 移植 rt thread Nano版本

16 篇文章 4 订阅
13 篇文章 2 订阅

前言

最近笔者对rt thread产生了浓厚兴趣,毕竟是国产嵌入式系统,必须得支持一波啊(另外还有华为的LiteOS)。于是,准备拿手头的芯片移植一波,据说资源占用小,轻量级系统,笔者便采用RT1011用来移植。因为之前有使用FreeRTOS的经验,对rtt的解读移植,算是很顺畅,没有遇到太多的障碍(文章末尾提供源码工程下载链接)。

1.官网下载内核代码 rtt 内核下载链接
在这里插入图片描述
这里我们先拿最简的Nano内核移植(其他组件更丰富,占时不介绍)。

2.解压内核,放入工程目录中
在这里插入图片描述
这里我们重点使用文件夹:libcpu和src
libcpu文件夹中:

/*1011内核为m7 所以在目录内选择m7,IDE使用的Keil选择rvds*/
context_rvds.s
cpuport.c

src文件夹中:

clock.c
components.c
cpu.c
idle.c
ipc.c
irq.c
kservice.c
mem.c
memheap.c
mempool.c
object.c
scheduler.c
slab.c
thread.c
timer.c

在这里插入图片描述
3.内核裁剪和初始化
内核裁剪同FreeRTOS一样,通过一个头文件来维护,这里rtt使用 rtconfig.h 维护。

/* RT-Thread config file */

#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__


/* RT-Thread Kernel */
#define RT_NAME_MAX     8
#define RT_ALIGN_SIZE   4
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX  32      //idle优先级  默认:RT_THREAD_PRIORITY_MAX-1
#define RT_TICK_PER_SECOND	    1000    //  <i>Default: 1000   (1ms)
#define RT_DEBUG
#define RT_USING_OVERFLOW_CHECK
#define RT_DEBUG_INIT             0     //启用组件初始化调试配置,设置为 1 则会打印自动初始化的函数名称
#define RT_DEBUG_THREAD           0
#define RT_USING_HOOK
#define IDLE_THREAD_STACK_SIZE    128

/* Memory Management */
#define RT_USING_MEMHEAP
#define RT_USING_MEMHEAP_AS_HEAP
#define RT_USING_HEAP

/* Inter-Thread communication */
#define RT_USING_SEMAPHORE
#define RT_USING_MUTEX
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE

/* RT-Thread Components */
#define RT_USING_COMPONENTS_INIT  
#define RT_USING_USER_MAIN
#define RT_MAIN_THREAD_STACK_SIZE     256  

/* Kernel Device Object */
//#define RT_USING_DEVICE
//#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE        128
#define RT_CONSOLE_DEVICE_NAME    "uart1"
#define ARCH_ARM
#define ARCH_ARM_CORTEX_M
#define ARCH_ARM_CORTEX_M7

/* Command shell */
//#define RT_USING_FINSH
//#define FINSH_THREAD_NAME         "tshell"
//#define FINSH_USING_HISTORY
//#define FINSH_HISTORY_LINES       5
//#define FINSH_USING_SYMTAB
//#define FINSH_USING_DESCRIPTION
//#define FINSH_THREAD_PRIORITY     20
//#define FINSH_THREAD_STACK_SIZE   4096
//#define FINSH_CMD_SIZE            80
//#define FINSH_USING_MSH
//#define FINSH_USING_MSH_DEFAULT

// <e>Software timers Configuration
// <i> Enables user timers
#define RT_USING_TIMER_SOFT         1
//软定时器是否开启
#if RT_USING_TIMER_SOFT == 0
#undef RT_USING_TIMER_SOFT
#endif
// <o>The priority level of timer thread <0-31>
//  <i>Default: 4
#define RT_TIMER_THREAD_PRIO		4
// 设置软件定时器线程的优先级,默认为  4
// <o>The stack size of timer thread <0-8192>
//  <i>Default: 512
#define RT_TIMER_THREAD_STACK_SIZE	512
// 设置软件定时器线程的栈大小,默认为 512 字节
// <o>The soft-timer tick per second <0-1000>
//  <i>Default: 100
#define RT_TIMER_TICK_PER_SECOND	100
// </e>

// #if defined(RTE_USING_DEVICE)
// #define RT_USING_DEVICE
// //是否开启设备对象
// #endif
// <<< end of configuration section >>>
#endif

初始化相关,rtt提供了接口函数 rt_hw_board_init 这里我们用来初始化外设,内存池定义等等。该函数是在main函数之前,具体顺序是: S u b Sub Sub$main --> rtthread_startup --> rt_hw_board_init --> main (中间省略一些)。

#define OCRAM_BEGIN         (0x20200000U)
#define OCRAM_END           (0x20207FFFU)

void rt_hw_board_init(void)
{  
	xBSP_Config();
	xBSP_MPUInit();	
    xBSP_GPIO_Init();
    
	xSYS_KeyScan_RegisterCallback(xAPP_KEY_KeyEventCallback);
	
	xALG_SampleConfig();   //算法回调和接口配置相关等
	xBSP_I2SInit(); 	
	
    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_CONSOLE) //&& defined(RT_USING_DEVICE)
	rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
    
	//初始化系统堆
#ifdef RT_USING_HEAP

#if defined(RT_USING_MEMHEAP) && defined(RT_USING_MEMHEAP_AS_HEAP)
    //PRINTF("sdram heap, begin: 0x%p, end: 0x%p\n", SDRAM_BEGIN, SDRAM_END);
    rt_system_heap_init((void *)OCRAM_BEGIN, (void *)OCRAM_END);

    // rt_memheap_init(&system_heap, "sram", (void *)HEAP_BEGIN, HEAP_SIZE);

#elif defined(RT_USING_SMALL_MEM)
    PRINTF("sram heap, begin: 0x%p, end: 0x%p\n", HEAP_BEGIN, HEAP_END);
    rt_system_heap_init((void *)rt_heap_begin_get, (void *)rt_heap_end_get);
#endif

#endif 
}

4.创建线程和通信机制使用等

int main(void)
{
	xAPP_CommunicationInit();
	//idle Hook 可用于看门狗,cpu使用率监控使用
	rt_thread_idle_sethook(vApplicationIdleHook);	

	GuiMain_thread = rt_thread_create("GuiMainTask",xTask_GuiMain,RT_NULL,512,5,20);                
	if (GuiMain_thread != RT_NULL)
	{
		rt_thread_startup(GuiMain_thread);
	}
	else
	{
		return -1;
	}
		
	MainMessage_thread = rt_thread_create("MainMessageLoop",xTask_MainMessageLoop,RT_NULL,512,3,10);                
	if (MainMessage_thread != RT_NULL)
	{
		rt_thread_startup(MainMessage_thread);
	}
	else
	{
		return -1;
	} 

	ReciveMessage_thread = rt_thread_create("ReciveMessage",xTask_ReciveMessage,RT_NULL,512,2,10);                
	if (ReciveMessage_thread != RT_NULL)
	{
		rt_thread_startup(ReciveMessage_thread);
	}
	else
	{
		return -1;
	} 

	sysTimer = rt_timer_create("sys_timer",SoftWareTimer10msCallback,RT_NULL,10,RT_TIMER_FLAG_PERIODIC);
	rt_timer_start(sysTimer);
}

邮箱创建和接收线程处理

int xAPP_CommunicationInit(void)
{
    rt_err_t result;

    result = rt_mb_init(&mb,"mailBox",&mailbox_pool[0],MAILBOX_POOL_SIZE,RT_IPC_FLAG_FIFO);
    if(result != RT_EOK)
    {
        return -1;
    }

    return 0;
}

void xTask_ReciveMessage(void* parameter)
{
    uint32_t* Message;

	for(;;)
	{
        if(rt_mb_recv(&mb,(rt_uint32_t*)&Message,RT_WAITING_FOREVER) == RT_EOK)
        {
			mbData = Message[0];
			
            rt_free(Message);
        }

		rt_thread_delay(10);
	}
}

void xAPP_KEY_KeyEventCallback(KEY_Message_TypeDef* pKeyStatus)
{
    KEY_Message_TypeDef status = *pKeyStatus;
	
    if(status.KeyDown & NUM_KEY0)  //按下事件通过邮箱发送,接收线程处理
    {
        uint32_t* message = rt_malloc(sizeof(uint32_t));
        *message = MSG_TYPE_MAIN_KEY | NUM_KEY0;
        rt_mb_send_wait(&mb,(rt_uint32_t)message,10);
    }            
}

具体源码下载:rt1011_rt_thread

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是意法半导体(STMicroelectronics)生产的一款32位嵌入式微控制器,具有高性能和低功耗的特点。RT-Thread Nano是RT-Thread实时操作系统的一个轻量级版本,适用于资源受限的嵌入式系统。 在将RT-Thread Nano移植到STM32F103上之前,需要先了解RT-Thread Nano的架构和STM32F103的硬件特性。 首先,需要确保RT-Thread Nano的源代码和STM32F103的开发环境已经准备好。接着,根据STM32F103的芯片手册和引脚映射表,需要对RT-Thread Nano的硬件抽象层进行适配,确保操作系统可以正确地访问外设和中断。 其次,需要根据STM32F103的内存和存储器大小来合理配置RT-Thread Nano的内存管理器和文件系统。可以根据实际需求对系统进行裁剪,移除不必要的模块和功能,以减小系统的内存占用和代码体积。 然后,需要配置STM32F103的系统时钟和中断向量表,并在启动代码中初始化硬件资源和系统任务。可以参考RT-Thread Nano的官方文档和示例代码,根据具体的硬件平台和应用需求进行相应的设置和调试。 最后,进行系统的编译、烧录和调试。可以使用STM32F103的开发工具链和调试器,对编译后的固件进行烧录和调试,确保系统能够正确地启动和运行。 总结来说,将RT-Thread Nano移植到STM32F103上需要进行硬件适配、内存管理和系统配置等工作,最终通过编译、烧录和调试来验证移植的正确性。这样可以使得STM32F103可以运行使用RT-Thread Nano操作系统的应用程序,实现更灵活和可靠的嵌入式系统设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值