rt_thread nano GD32F407移植_rt_malloc gd32-程序员宅基地

技术标签: stm32  rtt  arm  

rt_thread nano GD32F407移植

1、简介

RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。

架构

RT-Thread Nano版本与其他RTOS的区别在于新增加了一个可裁剪的FinSH控制台,主要是通过串口实现的类似linux命令行终端的功能。

2、RT-Thread Nano移植

移植目结构

rtthread-nano 源码中,与移植相关的文件位于下图中有颜色标记的路径下(黄色表示 libcpu 移植相关的文件,绿色部分表示板级移植相关的文件):

与移植相关的文件

移植步骤

添加文件

Cortex-M 芯片内核移植代码:

context_rvds.s
cpuport.c

Kernel 文件包括

clock.c
components.c
device.c
idle.c
ipc.c
irq.c
kservice.c
mem.c
mempool.c
object.c
scheduler.c
thread.c
timer.c

配置文件:

board.c
rtconfig.h

屏蔽中断与异常处理

RT-Thread 会接管异常处理函数 HardFault_Handler() 和悬挂处理函数 PendSV_Handler(),这两个函数已由 RT-Thread 实现,所以需要删除工程里中断服务例程文件中的这两个函数,避免在编译时产生重复定义。如果此时对工程进行编译,没有出现函数重复定义的错误,则不用做修改。

系统时钟配置

需要在 board.c 中实现 系统时钟配置(为 MCU、外设提供工作时钟)与 os tick 的配置 (为操作系统提供心跳 / 节拍)。

如下代码所示,用户需要在 board.c 文件中系统初始化和 OS Tick 的配置,用户需在 timer 定时器中断服务函数调用 rt_os_tick_callback function,cortex-m 架构使用 SysTick_Handler()

在这里插入图片描述

内存堆初始化

系统内存堆的初始化在 board.c 中的 rt_hw_board_init() 函数中完成,内存堆功能是否使用取决于宏 RT_USING_HEAP 是否开启,RT-Thread Nano 默认不开启内存堆功能,这样可以保持一个较小的体积,不用为内存堆开辟空间。

开启系统 heap 将可以使用动态内存功能,如使用 rt_malloc、rt_free 以及各种系统动态创建对象的 API。若需要使用系统内存堆功能,则打开 RT_USING_HEAP 宏定义即可,此时内存堆初始化函数 rt_system_heap_init() 将被调用,如下所示:

heap1

初始化内存堆需要堆的起始地址与结束地址这两个参数,系统中默认使用数组作为 heap,并获取了 heap 的起始地址与结束地址,该数组大小可手动更改,如下所示:

6-2


3、FinSH组件移植

kprintf()移植

void rt_hw_console_output(const char *str)  //实现该函数,才能使用rt_kprintf
{
    
	 /* 进入临界段 */
  rt_enter_critical();
	
	while(*str!='\0')
	{
    
		 /* 换行 */
    if (*str == '\n')//RT-Thread 系统中已有的打印均以 \n 结尾,而并非 \r\n,所以在字符输出时,需要在输出 \n 之前输出 \r,完成回车与换行,否则系统打印出来的信息将只有换行
    {
    
       usart_data_transmit(USART1, '\r');
	
	     while(usart_flag_get(USART1, USART_FLAG_TC)== RESET);
    }

		usart_data_transmit(USART1, *(str++));
	
	  while(usart_flag_get(USART1, USART_FLAG_TC)== RESET);
		
	}
	 /* 退出临界段 */
  rt_exit_critical();  //注意:使用进入临界段语句rt_enter_critical(); 一定要使用退出临界段语句 rt_exit_critical();否则调度器锁住,无法进行调度
	
}

Finsh组件移植

char rt_hw_console_getchar(void)//使用Finsh组件三步骤:1.实现该函数及rt_hw_console_output函数;2.rtconfig.h中开启RT_USING_FINSH宏;3.添加Finsh组件(cmd.c、msh.c、shell.c),
{
      //查询方式实现,记得将Usart1初始化中的中断接收配置相关代码注释掉
	   int ch = -1;
	   /*等待串口1输入数据*/
     if(usart_flag_get(USART1, USART_FLAG_RBNE) != RESET)
		 {
    
         ch = (int)usart_data_receive(USART1);
			   usart_flag_clear(USART1, USART_FLAG_RBNE);
		 }
		 else
		 {
    
			 
         if(usart_flag_get(USART1, USART_FLAG_ORERR) != RESET)
         {
    
             usart_flag_clear(USART1, USART_FLAG_ORERR);
         }
         rt_thread_mdelay(10);
			 
		 }

     return ch;
}

移植成功后打开串口输入help可以看见如下信息表示移植成功

在这里插入图片描述

4、FinSH调试技巧

1、函数初始化功能

rt_thread的初始化有两种方式

方法一:将函数放入rt_hw_board_init()函数

int rtthread_startup(void)
{
    
    rt_hw_interrupt_disable();

    /* board level initialization
     * NOTE: please initialize heap inside board initialization.
     */
    rt_hw_board_init();

    /* show RT-Thread version */
    rt_show_version();

    /* timer system initialization */
    rt_system_timer_init();

    /* scheduler system initialization */
    rt_system_scheduler_init();

#ifdef RT_USING_SIGNALS
    /* signal system initialization */
    rt_system_signal_init();
#endif

    /* create init_thread */
    rt_application_init();

    /* timer thread initialization */
    rt_system_timer_thread_init();

    /* idle thread initialization */
    rt_thread_idle_init();

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return 0;
}

方法二: 使用宏 INIT_BOARD_EXPORT() 进行自动初始化,不需要显式调用 (推荐使用)

/*rtdef.h*/

/* board init routines will be called in board_init() function */
#define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn, "1")

/* pre/device/component/env/app init routines will be called in init_thread */
/* components pre-initialization (pure software initilization) */
#define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, "3")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, "5")
/* appliation initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, "6")

推荐使用这个函数,可以有效的降低模块之间的耦合性

2、串口调试功能

添加自定义命令

除了 FinSH 自带的命令,FinSH 还也提供了多个宏接口来导出自定义命令,导出的命令可以直接在FinSH 中执行。

MSH_CMD_EXPORT(name, desc);//命令及其描述,用于添加自定义命令

如下添加两个控制led打开和关闭的finsh命令

void LedpOn(void)
{
    
	gpio_bit_set(GPIOF,GPIO_PIN_0);
}
MSH_CMD_EXPORT(LedpOn, Control Beep On);


void LedpOff(void)
{
    
	gpio_bit_reset(GPIOF,GPIO_PIN_0);
}

MSH_CMD_EXPORT(LedpOff, Control Beep Off);

打开终端就可以看见自己添加的命令了

d打开和关闭的finsh命令

void LedpOn(void)
{
    
	gpio_bit_set(GPIOF,GPIO_PIN_0);
}
MSH_CMD_EXPORT(LedpOn, Control Beep On);


void LedpOff(void)
{
    
	gpio_bit_reset(GPIOF,GPIO_PIN_0);
}

MSH_CMD_EXPORT(LedpOff, Control Beep Off);

打开终端就可以看见自己添加的命令了

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_20069263/article/details/122416649

智能推荐

Android_handler_网络请求_img框架-程序员宅基地

文章浏览阅读111次。Android_handler_网络请求_img框架 1,Android网络请求1.1显示互联网的图片①获取输入的路径②使用API URL(统一资源定位符)URL url = new URL(path);③通过路径打开一个http的连接,打开通道HttpURLConnection conn = (强转)url.openC..._android 网络请求 handler

函授计算机应用基础答案,计算机应用基础函授本科考试题库-程序员宅基地

文章浏览阅读3.5k次。本资料备战9月,请勿修改版权信息计算机应用基础一、单选题1、ENIAC计算机所采用的电子器件是______答案: AA:电子管 B:晶体管 C:中小型集成电路 D:大规模及超大规模集成电路2、如果某台计算机运算速度为数千亿次/秒,主要用于大型科学与工程计算,按其规模应该属于______答案: BA:大型计算机 B:巨型计算机 C:微型计算机 D:专用计算机 3、计算机具有高效的运...

谈谈技术面试【转载】-程序员宅基地

文章浏览阅读37次。面试就是在短时间内对应聘者的经验、能力、潜力进行评估。我一般比较关注这些方面:(1)品格;(2)经验;(3)解决问题的能力;(4)技术特长;(5)潜力。面试时间一般为1小时,笔试+机试+面谈。 下面结合偶常用的一份C++/C#程序员面试题谈谈体会。 面试题一般分为3~4部分。第一部分是自我评估,第二部分是上机编程,第三部分是领域相关的东东,第四部分是考查能力与潜力的...

Android中WebView加载sdcard中的html时提示:ERR_FILE_NOT_FOUND和ERR_ACCESS_DENIED_h5页面 sd卡 file加载 err_access_denied-程序员宅基地

文章浏览阅读4.1k次。场景Android中WebView加载sdcard中的html显示:Android中WebView加载sdcard中的html显示_BADAO_LIUMANG_QIZHI的博客-程序员宅基地在实现上面的需求时遇到的两个问题。一个是ERR_FILE_NOT_FOUND一个是ERR_ACCESS_DENIED注:博客:BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_程序员宅基地-C#,SpringBoot,架构之路领域博主关注公众号霸道的程.._h5页面 sd卡 file加载 err_access_denied

nacos区分权限_nacos 用户权限-程序员宅基地

文章浏览阅读7.3k次。nacos设置权限,创建nacos用户_nacos 用户权限

江苏省学业水平测试信息技术软件,江苏2019年普通高中信息技术学业水平测试工作顺利结束...-程序员宅基地

文章浏览阅读672次。【导语】无忧考网会考频道从江苏教育考试院了解到,江苏2019年普通高中信息技术学业水平测试工作顺利结束,具体如下:12月17日下午2:30时,在全省各级教育行政、招考部门和各考点中学的共同努力之下,在各有关部门和单位的大力支持配合下,我省2019年普通高中信息技术学业水平测试工作已安全平稳顺利结束。全省共设考点298个,考场794个,用于考试的计算机36872台,约31.7万名考生参加考试。各地考..._学业水平测试考信息技术的省份

随便推点

C#将数据库图片显示在pictureBox_c# picturebox显示数据库中图片-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏10次。这里的图片存在数据表的形式为十六进制的数据,参数ds为从数据库中选出的DataSet,字段FImage为图片字段。private void getPicture(DataSet ds) { //int Pictured = dataGridView1.FocusedRowHandle; int rid=dataGridView1._c# picturebox显示数据库中图片

ESP8266呼吸灯亮度调节并且实时显示PWM数值_esp8266wangye滑块调光-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏16次。以下代码实现了ESP8266的网页控制板载LED灯的亮度调节,并且将GPIO_2的PWM数值显示在网页上。网页显示代码来自:太极创客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-server/pin-state/PWM控制代码来自:Arduino 编程 ESP8266 12F NodeMCU 实现 PWM 控制呼吸灯(作者:我不是阿言)https://blog.csdn.net_esp8266wangye滑块调光

转载:向量与矩阵的范数_向量与矩阵的范数csdn-程序员宅基地

文章浏览阅读233次。 阅读文献时,经常看到各种范数,机器学习中的稀疏模型等,也有各种范数,其名称往往容易混淆,例如:L1范数也常称为“1-范数”,但又和真正的1-..._向量与矩阵的范数csdn

密码输入失败次数限制_昆仑通泰触摸屏用户管理有登录次数限制吗-程序员宅基地

文章浏览阅读2.3k次。今天给两个项目加上了登录时在一定时间内输入密码多次失败就锁定账号的功能,锁定之后需要管理员进行解锁才能够继续登陆;两个项目一个是用shiro,一个没用shiro;不过都差不多,下面只讲用shiro的,具体业务可以根据自己需求去修改(比如:登录失败多次不锁定账号,只是以相对时间内的次数去判断,超过该段时间就可以继续登陆;时间自己设定)数据库:建立一个表存放用户登录失败的记录(密码最好加密后再存进..._昆仑通泰触摸屏用户管理有登录次数限制吗

zabbix之备份与恢复(转)_zabbix备份恢复-程序员宅基地

文章浏览阅读2.9k次。zabbix前端的所有操作都是存在数据库里的,在数据库里都会有对应的表,所以对zabbix备份,只需备份zabbix数据库就行了。使用最广泛的备份方法还是使用mysqldump。一:全库备份[root@zhu1 ~]# mysqldump -uroot -p123456 --opt zabbix | bzip2 > zabbix.sql.bz2[root@zhu1 ~]# ll zabbix.sql.bz2-rw-r–r-- 1 root root 2353816 10-23 00:54 za_zabbix备份恢复

error while loading shared libraries 错误解决办法总结,_error while loading shared libraries: libcairo.so.-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏5次。最近安装了装了几次ACE库,装起来会出现很多问题。 其实我发现直接按照ace的帮助文档进行编写。就差不多。安装完成后,经常会遇到以下问题error while loading shared libraries,就是编译器没有找到相应的lib库文件。 从互联网上找到了一些文章, 解决了我的问题:贴一下。缺少libclntsh.so.11.1当运行./aliba_error while loading shared libraries: libcairo.so.2: cannot open

推荐文章

热门文章

相关标签