基于固件库的RT-THREAD移植

news2024/10/3 2:15:18

为什么要使用操作系统

当我们进入嵌入式这个领域的时候, 往往首先接触的都是单片机编程, 单片机编程又首选 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.coloradmin.cn/o/1412706.html

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

相关文章

独占指针:unique_ptr 与 函数调用 笔记

推荐B站视频&#xff1a; 2.unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p2&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 3.unique_ptr与函数调用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p3&vd_sourcea934d…

如何阅读xml电子发票

xml电子发票是官方给出的电子存档的文件格式&#xff0c;本质是文本&#xff0c;所以文件很小&#xff0c;大量发票存储&#xff0c;能够更加凸显优势。 但是xml电子发票不方便阅读&#xff0c;因为里面是xml格式&#xff0c;对于财务人员来讲&#xff0c;看“代码”简直太难了…

Android App开发基础(3)——App的设计规范

3 App的设计规范 本节介绍了App工程的源码设计规范&#xff0c;首先App将看得见的界面设计与看不见的代码逻辑区分开&#xff0c;然后利用XML标记描绘应用界面&#xff0c;同时使用Java代码书写程序逻辑&#xff0c;从而形成App前后端分离的设计规约&#xff0c;有利于提高App集…

CSMA/CD 协议——笔记

目录 CSMA/CD 协议 以太网采取的 2 种重要措施 CSMA/CD 协议的要点 CSMA/CD 协议工作流程 碰撞后重传的时机 CSMA/CD 协议的要点 CSMA/CD 协议 最早的以太网&#xff1a;将许多计算机都连接到一根总线上。 总线特点&#xff1a;易于实现广播通信&#xff0c;简单&…

Linux详细笔记大全

第0章 Linux基础入门 什么是计算机 计算机的组成: 控制器,是整个计算机的中枢神经,根据程序要求进行控制,协调计算机各部分工作及内存与外设的访问等。 运算器,功能是对数据进行各种算术运算和逻辑运算。 存储器,功能是存储程序、数据和各种信号、命令等信息。 输入设备…

JavaScript 学习笔记(WEB APIs Day6)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

网页首页案例(使用框架:继上一篇博客结尾)

文章目录 新认识的快捷键1.先写好组件并导入App.vue2.往组件中一个一个填内容3.整体静态完成后&#xff0c;发现某些小部分相同&#xff0c;其实可以分装成小组件4.最后通过js动态渲染 新认识的快捷键 1.Ctrl滚轮按住往下拖可以部分选中 .用同样的方法选中下面的111&#xff0…

temu跨境电商怎么样?做temu蓝海项目有哪些优势?

在全球电商市场激烈的竞争中&#xff0c;Temu跨境电商平台以其独特的优势和策略&#xff0c;逐渐崭露头角。对于许多想要拓展海外市场的商家来说&#xff0c;Temu的蓝海项目提供了一个充满机遇的新平台。本文将深入探讨Temu跨境电商的优势以及在蓝海市场中的发展前景。 全球化市…

32人联机自建服务器攻略【幻兽帕鲁多人游玩】

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

JavaScript DOM对象的尺寸和位置详解

在DOM对象操作中&#xff0c;其尺寸和位置也是DOM的核心内容&#xff0c;因为js的“交互式应用”几乎少不了对DOM对象的尺寸和位置进行操作&#xff0c;特别是js动画效果。 一、关于DOM对象的尺寸和位置介绍 二、DOM文档对象的尺寸 1、obj.scrollWidth 和 obj.scrollHeight …

MATLAB环境下使用训练好的卷积神经网络进行大地电磁数据噪声抑制

大地电磁MT是一种比较成熟的地球物理勘探方法&#xff0c;通过计算地面测量的正交电场分量和磁场分量的扰动值研究地下介质的电性结构。MT在油气和工程勘探领域得到了广泛应用。但是由于该方法以天然电磁场为场源&#xff0c;存在地面信号弱和源激发随机的缺点&#xff0c;极易…

Doris 与 Clickhouse 对比(一)

1. 常用引擎 ☕️ Doris 表数据模型 duplicate key &#x1f3ac; 场景&#xff1a;适用于数据无需提前聚合的分析业务。 ⚠️ 注意点&#xff1a;只指定排序列&#xff0c;相同的行并不会合并。 unique key &#x1f3ac; 场景&#xff1a;适用于有更新需求的业务。 ⚠…

Dlearning

Deep Learning Basic 神经网络&#xff1a; #mermaid-svg-rR22a8Udy5SxGOoP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rR22a8Udy5SxGOoP .error-icon{fill:#552222;}#mermaid-svg-rR22a8Udy5SxGOoP .error-t…

JPDA框架和JDWP协议

前言 在逆向开发中,一般都需要对目标App进行代码注入。主流的代码注入工具是Frida,这个工具能稳定高效实现java代码hook和native代码hook,不过缺点是需要使用Root设备,而且用js开发,入门门槛较高。最近发现一种非Root环境下对Debug App进行代码注入的方案,原理是利用Jav…

使用js判断list中是否含有某个字符串,存在则删除,

显示上图中使用了两种方式&#xff0c; 左边的是filter将不等于userCode的元素筛选出来组成一个新的list&#xff0c; userCodeList.filter(item> item!userCode)&#xff1b;但是上面这个方法在IE浏览器中不支持&#xff0c; 所以改成了右边的方法&#xff0c;使用splice…

【代码随想录-数组】有序数组的平方

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

MAIA ACTIVE×实在RPA丨低成本、高效率管理达人推广计划,业务提效超6倍

MAIA ACTIVE&#xff08;以下简称“MAIA”&#xff09;是一个专为亚洲女性设计的运动服品牌&#xff0c;于2016年成立于上海。作为女装细分市场的头部企业&#xff0c;MAIA凭借与抖音、小红书等平台达人合作&#xff0c;迅速积累了知名度&#xff0c;并长期保持品牌曝光度和销售…

STM32标准库——(4)OLED显示屏

1.STM32调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上Keil调试模式&#xff1a;借助Keil软件的调试模式&…

假期刷题打卡--Day15

1、MT1152韩信又生气了 韩信点兵(大于10人)&#xff0c;三个三个一排少1个人&#xff0c;五个五个一排又少1个人&#xff0c;七个七个一排还少1个人。韩信生气了&#xff0c;从别的队伍里调来一个人!这样不管是三个一排五个一排还是七个一排都完美了。问原本最少应该有多少人。…

STM32标准库——(3)GPIO输入

1.按键简介 按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动 1.1 硬件电路图 上面两个是外加上拉电阻&#xff08;常用…