技术标签: stm32 实时操作系统 RT-Thread 嵌入式硬件
目录
以RT-Thread Nano的源码结构为例子:
主要涉及3个目录
以理解使用RT-Thread为目标的话,最核心的文件只有5个:
src\thread.c
src\timer.c
src\scheduler.c
src\ipc.c
include\rtservice.h
这些文件的作用列表如下:
重要的文件 | 作用 |
src\thread.c | 线程相关的文件,比如创建线程、启动线程 |
src\timer.c | 定时器相关的文件 |
src\scheduler.c | 调度器:维护线程的就绪链表、提供临界区的进出函数 |
src\ipc.c | 实现了线程间通信的各类对象:消息队列、信号量、互斥量、事件等 |
include\rtservice.h | 提供链表操作 |
移植RT-Thread,包含CPU部分移植和BSP部分移植
CPU部分移植就是移植libcpu目录,主要涉及cpuport.c和context.xx.S
比如:libcpu\arm\contex-m3\cpuport.c和context_rvds.S,这表示Context-M3架构在RVDS或Keil工具上的移植文件
如果,RT-Thread还没支持你使用的CPU,你才需要实现这两个文件。
一般来说,对于大部分的CPU,RT-Thread都已经支持,不需要我们移植
BSP就是Board Support Package,板级支持包,就是开发板的相关文件
BSP部分主要涉及main.c board.c和rtconfig.h
比如:bsp\stm32\stm32f103-simulator目录下,包含applications\main.c、board\board.c、和rtconfig.h
RT-Thread操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提出了不同的内存分配管理算法
总体上可以分为3类:内存堆管理和内存池管理,而内存对管理又根据具体内存设备划分为三种情况
总结起来就是:
内存堆管理:它可以分为3种,三种只能选择一种
针对小内存块的分配管理算法(小内存管理算法):src\mem.c
针对大内存块的分配管理算法:(slab管理算法):src\slab.c
针对多内存堆的分配情况(memheap管理算法):src\memheap.c
内存池管理:先从内存堆里申请空间、然后进行二次管理,对应文件src\memppool.c
注意:
src\mem.c、src\slab.c、src\memheap.c这三个文件只能选择一个文件
src\mempool.c:先从堆里分配的到一块内存,把这块内存当作内存池
RT-Thread启动流程如下所示,在图中标出颜色的部分需要用户特别注意(黄色表示libcpu移植相关的内容,绿色部分表示板级移植相关的内容)
RT-Thread启动代码统一入口为rtthread_startup(),芯片启动文件在完成必要工作(初始化时钟、配置中断向量表、初始化堆栈、初始化PC指针、调用C库函数-main最终去到C的世界)后,最终会在程序跳转市,跳转至RT-Thread的启动入口中,RT-Thread的启动流程如下;
1、全局关中断,初始化与系统相关的硬件、
2、打印系统版本信息、初始化系统内核对象(如定时器、调度器)
3、初始化用户 main线程,同时会初始化线程栈,在main线程中对各类模块依次进行初始化、
4、初始化软件定时器线程、初始化空闲线程、
5、启动调度器,系统切换到第一个线程开始执行(如mian)线程,并打开全局中断
我们习惯从main函数开始阅读源码,但是RT-Thread的主要启动流程反而不在main函数里
可以分析看到,在stm32的启动代码中,先调用SystemInit:系统初始化、比如初始化时钟,调用__main函数:重定位,比如把代码段从Flash复制到内存,然后执行$Sub$$main
第二个文件:src\components.c:执行一系列的 初始化,调用rt_application_init(初始化RTT组件包括创建SHEEL线程:因为有SHEEL线程,所以即使main函数为空,也是可以操作开发板的),调用main函数:可以写为空函数;启动调度器:rt_system_scheduler_start
整体启动流程详细可以见上图
这里不详细展开,RT-Thread的官方文档中有详细的说明
官方的代码风格和编程风格文档如下:
documentation/contribution_guide/coding_style_cn.md · RT-Thread/rt-thread - Gitee.com
最后在添加一个个人认为比较详细的将RT-Thread移植到STM32上的博客,本人亲测有效
PHP一共给了四个版本,VC9 x86 Non Thread Safe、VC9 x86 Thread Safe、VC6 x86 Non Thread Safe、VC6 x86 Thread Safe,这让我这个菜鸟头疼啊,还好 PHP 官网供给的处所左边有个英文 choose 我看懂了,我估摸着就是如何来选择版本的意思吧,于是开端查字典及上彀查找,终于看熟悉打听了具体意思,拿来做个备忘先。一、如何...
针对android 11 intent1.setDataAndType(uri, “image/*”);,如果是7.0及以上的系统使用FileProvider的方式创建一个Uri,7一下 Uri.fromFile,不要传cut.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//保存到uri指定的位置,指定位置就剪切不了,不指定位置 在onAcrivityResult里面data.getdata就可以获取到uri,然后用Glide.asfile就可
vue中组件的样式是有作用域的,默认是全局样式。如果不希望当前组件中的样式影响到别的组件,可以添加作用域。通过给style添加 scoped<style scoped></style>在有作用域的组件中如何给子组件设置样式?默认只能作用到子组件的根节点(组件的class 默认作用到组件的根节点)使用子组件的根节点本身的class类名如果是第三方组件,不知道它的根节点的类名,那就审查元素查看,或者添加一个类名//APP.vue<style sc
centos 7 卸载 mariadb 的正确命令列出所有被安装的rpm package rpm -qa | grep mariadb卸载 rpm -e mariadb-libs-5.5.37-1.el7_0.x86_64错误:依赖检测失败:libmysqlclient.so.18()(64bit) 被 (已安裝) postfix-2:2.10.1-6.el7.x86_64 需要强制卸载...
转载自:https://blog.csdn.net/qq_27626333/article/details/52304091NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:(1)、允许用户从NPM服务器下载别人编写的第三方包到本地使用。(2)、允许用户从NPM...
XDOJ 175 窗口模拟
.net 一般的富文本编辑器都是使用 一般处理程序上传图片或者文件的 那么黑客就可以利用开发者的疏忽(没有判断权限)直接通过伪造表单上传经过他更改过的木马文件 伪装成.jpg(各种图片格式)。提交上传完成之后只要访问一下这个路径(上传完成后会返回)以上就是没有加权限判断导致的。任何人都能通过富文本编辑器上传文件为了防止这样事情的发生,我们做一下调整我...
公众号后台回复“图书“,了解更多号主新书内容作者:叶庭云来源:早起Python本文介绍如何利用requests+正则表达式爬取TIOBE编程语言热度数据,并使用????openpyx...
SQL:点击(此处)折叠或打开select row_number() over(partition by name order by col desc) ,* from table;函数“row_number”必须有使用 ORDER BY 的 OVER 子句,按照字段col来排列自动取值partition by name order by
原标题:Python程序员学习路径之数据结构篇点击标题下「异步图书」可快速关注在计算机科学中,数据结构是一门进阶性课程,概念抽象,难度较大。Python语言的语法简单,交互性强。用Python来讲解数据结构等主题,比C语言等实现起来更为容易,更为清晰。而对于自学Python的朋友往往会遇到数据结构的问题,和所有的现代编程语言一样,Python也有大量的功能和构造。然而,Python是少数的几种基本...
原论文名称:Exploring Visual Relationship for Image Captioning作者:Ting Yao, Yingwei Pan, Yehao Li, and Tao Mei论文地址摘要人们总是相信,对象之间的建模关系将有助于表示和最终描述图像。然而,没有现有技术支持从建模对象关系出发进行image caption生成。在本文中,介绍了一种新的设计-...
es6 类,继承,原型链In the early history of the JavaScript language, a cloud of animosity formed over the lack of a proper syntax for defining classes like in most object oriented languages. It wasn’t until t...