基于固件库的RT-THREAD移植

为什么要使用操作系统

当我们进入嵌入式这个领域的时候, 往往首先接触的都是单片机编程, 单片机编程又首选 51 单片机来入门。 这里面说的单片机编程通常都是指裸机编程,即不加入任何 RTOS(Real Time Operation System 实时操作系统) 的程序。 常用的 RTOS 有国外的 FreeRTOS、μC/OS、 RTX 和国内的 RT-Thread、 Huawei LiteOS 和 AliOS-Things 等, 其中尤以国外开源且免费的 FreeRTOS 的市场占有率最高。
在裸机系统中,所有的程序基本都是自己写的, 所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型的电子产品用的都是裸机系统, 而且也能够满足需求。但是为什么还要学习 RTOS 编程,偏偏还要整个操作系统进来。一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度, 我们可以考虑引入 RTOS 实现多线程管理, 这是使用RTOS 的最大优势。二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备,而不是一味的在裸机编程上面死磕。作为一个合格的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。书到用时方恨少,我希望机会来临时你不要有这种感觉。

RT_thread的移植

准备工作:
1.准备一个工程(LED灯,按键,USART,系统定时器等驱动)
在这里插入图片描述

2.准备RT_thread的源码
在这里插入图片描述

解压过后的源码:
在这里插入图片描述

bsp--文件保存的板级支持包,支持不同的芯片
components--包含了一些组件信息 finsh--用于调试打印,在终端上显示调试信息(使用到底层的串口资源)
include--包含的都是头文件
libcpu--和底层硬件相关的库函数
src--内核源码

1.将压缩包中的内容全部复制到工程中
在这里插入图片描述

复制到如下位置(以下是自己准备的裸机代码位置):
在这里插入图片描述

修改名字3.0.3为rt_thread
在这里插入图片描述

复制如下文件到工程中的user目录中:
在这里插入图片描述
在这里插入图片描述

打开工程添加分组:
在这里插入图片描述

rtt_src添加的的是系统中SRC文件中的内容:
在这里插入图片描述

添加rtt_port分组,:
在这里插入图片描述

在这里插入图片描述
添加头文件:
在这里插入图片描述

编译代码,编译完成之后,修改错误:

..\User\rtconfig.h(6): error:  #5: cannot open source input file "RTE_Components.h": 
No such file or directory

在这里插入图片描述

注释掉此头文件(如果不能修改,查看文件属性,进行修改)
在这里插入图片描述

重复定义:

.\Objects\BH-F103.axf: Error: 
L6200E: Symbol HardFault_Handler multiply defined (by context_rvds.o and 
stm32f10x_it.o).
.\Objects\BH-F103.axf: Error: 
L6200E: Symbol PendSV_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Objects\BH-F103.axf: Error: 
L6200E: Symbol SysTick_Handler multiply defined (by board.o and delay.o).

SysTick_Handler:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rtconfig.h文件的修改:

修改优先级和系统定时器
在这里插入图片描述

修改栈区空间:
在这里插入图片描述

打开信号量和事件、互斥
在这里插入图片描述

使能堆区:
在这里插入图片描述

修改board.c文件
此文件中操作系统和底层硬件的链接部分,比如系统定时器
需要先将board.c文件添加到rtt_src分组
首先我们先来看内核中的系统定时器地址:
core_cm3.h
SysTick_BASE 地址–0xe000e010
在这里插入图片描述

再看OS中的,定时器地址:
在这里插入图片描述
在这里插入图片描述

void rt_hw_board_init()
包含了我们底层设备的驱动信息
修改:注释掉或者删除
在这里插入图片描述

添加初始化内容:
在这里插入图片描述
添加一个board.h
路径和Board.c一样
在这里插入图片描述
编译代码,查看有没有错误:
在这里插入图片描述

验证工程可用性

#include <rtthread.h>
#include <rthw.h>
#include "board.h"
void LED1_Pthread(void *para);
rt_thread_t led1_thread;
int main(void)
{//创建线程--LED
led1_thread=rt_thread_create("led1",LED1_Pthread,NULL,128,5,20);if(led1_thread !=RT_NULL){rt_thread_startup(led1_thread);}while(1){}return 0;
}void LED1_Pthread(void *para)
{while(1){LED1ON();rt_thread_delay(500);rt_kprintf("led1 running!!\r\n");//将打印信息输出到我们的串口助手中LED1OFF();rt_thread_delay(500);}
}

finsh组件:

FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。
用户在控制终端输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的 FinSH,FinSH 会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。
使用以下函数的前提,必须配置好串口1的驱动:
rt_kprintf–修改此函数的打印方向:
在这里插入图片描述

void rt_hw_console_output(const char *str)
{    /* 进入临界段 */rt_enter_critical();/* 直到字符串结束 */while (*str!='\0'){/* 换行 */if (*str=='\n'){USART_SendData(USART1, '\r'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}USART_SendData(USART1, *str++);                 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    }    /* 退出临界段 */rt_exit_critical();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

药物使用不当可能会导致耳聋,尤其是这6类,需警惕

耳聋的原因有很多&#xff0c;其中之一就是药物使用不当。有些药物具有耳毒性&#xff0c;也就是说&#xff0c;它们会损害内耳的结构和功能&#xff0c;导致听力下降或丧失。这种药物性耳聋有时是可逆的&#xff0c;有时则是永久的。那么&#xff0c;到底哪些药物会导致耳聋和…

SQL触发器练习

创建职工表以及职工工资表 职工表字段&#xff1a;工号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄 工资表字段&#xff1a;编号自增&#xff0c;职工工号&#xff0c;基础工资10000 通过触发器实现&#xff1a; 对职工进行添加时 工资表中也要体现当前职工的信息 对职工…

Java工程师简历自我评价范文

Java工程师简历自我评价范文1 (一) 1. 在学习Core Java基础时,对一些Java常用类,其具体方法和参数不熟不会用 时,我经常会查询JavaAPI文档,使我养成了查询JavaAPI的良好习惯. 2. 在达内集中的系统培训项目过程中,能够一起和项目小组成员按时完成各个 模块,小组成员编写代码…

ctf-idea调试jar包

0.拿到jar包并解压 进入解压出来的目录,然后以该目录打开项目 1.设置maven 设不设置都行 2.添加依赖 添加两个依赖, boot-inf下的 classes和lib 3.配置调试器 添加 remote jvm debug 1.根据jdk版本选择调试参数 2.选择module classpath为解压后的文件夹名 如图,运行jar包的…

CDR绘图软件|安装教程来了(小白福利:有红包封面领取哦!)

前言 今天给小伙伴们讲讲&#xff1a;如何安装CDR软件。 如果未来的你想从事平面设计/广告行业&#xff0c;那应该就会接触到CDR这款软件。 CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件&#xff1b;该软件是Corel公司出品的矢量图形制作工具软件&#xff0c;这…

分布式调度解决方案之elastic-job

elastic-job elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 &#xff0c; 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。 Elastic-Job-Lite定位为轻量级无中心化解决方案&#xff0c;使用jar包的形式提供分布式任务的协调服务。 …

Confluence 的文章导入到 YouTrack KB 中

YouTrack 是有一个 KB 的&#xff0c;我们可以吧 Confluence 的文章全部导入到 YouTrack 的 KB 中。 首先&#xff0c;你需要具有管理员权限&#xff0c;然后选择导入。 然后可以在打开的界面中新增一个导入。 在新增导入中输入 Confluence 在随后的界面中输入你 Confluence …

【Hexo博客|Fluid主题】实现链接卡片效果

文章目录 前言一、CardLink库二、配置步骤1. 添加静态js文件2. 使库文件生效3. 编写启用CardLink4. 查看效果效果与前面一致。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/06e0630f994d4d67a90e18e291c3fdc5.png#pic_center) 总结 前言 今天在阅读Github…

格子表单GRID-FORM | 嵌套子表单与自定义脚本交互

格子表单/GRID-FORM已在Github 开源&#xff0c;如能帮到您麻烦给个星&#x1f91d; GRID-FORM 系列文章 基于 VUE3 可视化低代码表单设计器嵌套表单与自定义脚本交互 新版本功能 &#x1f389; 不觉间&#xff0c;GRID-FORM 已经开源一年&#xff08;2023年1月29日首次提交…

通过FileZilla配置FTP

FileZilla服务端的安装 在虚拟机里安装FileZilla服务器 FileZilla的官网 下载一个客户端和一个服务端的FileZilla 如果已经有了一个客户端&#xff0c;可以不下用载。 FileZilla的配置 说明一下&#xff1a;通过FileZilla配置FTP有两种模式&#xff0c;我们先用被动模式 下载…

使用CompletableFuture实现并发计算-结合实例

一、什么是CompletableFuture&#xff1f; CompletableFuture 是Java 8引入的一个强大的并发工具类&#xff0c;它是Future接口的扩展实现。它提供了更丰富的异步编程模型和功能&#xff0c;允许开发者以非阻塞的方式处理异步计算的结果&#xff0c;并且可以将多个异步任务链式…

GoZero微服务个人探究之路(九)api文件编写总结

参考来源go-zero官方文档https://go-zero.dev/docs/tutorials 前言 go-zero是目前star最多的go语言微服务框架&#xff0c;api 是 go-zero特殊的语言&#xff0c;类型文件&#xff0c;go-zero自带的goctl可以通过.api文件生成http服务代码 api文件内容编写 不可使用关键字 …

Datawhale 组队学习之大模型理论基础 Task7 分布式训练

第8章 分布式训练 8.1 为什么分布式训练越来越流行 近年来&#xff0c;模型规模越来越大&#xff0c;对硬件&#xff08;算力、内存&#xff09;的发展提出要求。因为内存墙的存在&#xff0c;单一设持续提高芯片的集成越来越困难&#xff0c;难以跟上模型扩大的需求。 为了…

MATLAB|融合需求侧虚拟储能系统的楼宇微网优化调度¥29

目录 主要内容 模型研究 一、虚拟储能特征 二、楼宇微网虚拟储能 结果一览 下载链接 主要内容 该模型以楼宇为研究对象&#xff0c;围绕夏季制冷负荷&#xff0c;利用楼宇的蓄热特性&#xff0c;实现融合需求侧虚拟储能系统的楼宇微网优化调度模型&#xff0c;…

带【科技感】的Echarts 图表

Echarts脚本在线地址 https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js 引入Echarts 脚本后粘贴代码 vue2 代码&#xff1a; <template><div><div ref"col-2-row-2" class"col-2-row-2"></div></div> <…

研究性学习:科技发展调查

1. 课题名称 科技发展调查 2. 起止时间 起始时间:2024年1月25日 结束时间:2024年2月20日 3. 项目组成员 组长:张三组员:李四、王五校内指导教师:杨老师校外指导教师:科技专家刘教授4. 组员分工情况 搜集整理资料: 张三:负责搜集西安市高铁领域的科技发展情况。李四…

力扣题目训练(1)

2024年1月25日力扣题目训练 2024年1月25日力扣题目训练225. 用队列实现栈257. 二叉树的所有路径258. 各位相加81. 搜索旋转排序数组 II82. 删除排序链表中的重复元素 II30. 串联所有单词的子串 2024年1月25日力扣题目训练 2024年1月25日开始进行编程训练&#xff0c;今天主要是…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第4章 朴素贝叶斯法

文章目录 第4章 朴素贝叶斯法4.1 朴素贝叶斯法的学习与分类4.1.1 基本方法4.1.2 后验概率最大化的含义4.2 朴素贝叶斯法的参数估计4.2.1 极大似然估计4.2.2 学习与 算法4.2.3 贝叶斯估计代码实践GaussianNB 高斯朴素贝叶斯scikit-learn实例scikit-learn:伯努利模型和多项式模型…

网安渗透攻击作业(1)

实现负载均衡 第一步&#xff1a;安装依赖 sudo apt insta11 libgd-dev 第二步&#xff1a;下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 第三步&#xff1a;对nginx进行解压 tar -zvxf nginx-1.22.1.tar.g2 第四步&#xff1a;编译安装nginx cd ngi…

通达信动量振荡指标公式(AO),反映市场驱动力的变化

动量振荡指标AO(Awesome Oscillator)衡量的是最近5根K线的动量与过去34根K线的动量对比&#xff0c;反映市场驱动力的变化。 一、动量振荡指标公式&#xff08;副图&#xff09; 动量振荡指标AO计算公式&#xff1a; 1、计算中间价&#xff0c;将最高价和最低价的和除以2&…