当前位置: 首页 > news >正文

RTOS之二环境搭建初识RTOS

参考:https://blog.csdn.net/kouxi1/article/details/123650688

视频:https://www.bilibili.com/video/BV1b14y1c783/

RTOS本质就是切换线程栈,栈换了环境就换了,一个重要的结构tcb(linux叫PCB或thread_info)

struct tcb{

int32_t *sp; // 重要的sp指针,其它寄存器保存在栈中

struct tcb *next; // 下一个tcb

};

采用Valvano教授的RoundRobin_4C123源码一张图解释线程调度

两个重要文件os.c osasm.s

  1. os.c

void StartOS(void);

#define NUMTHREADS 3 // maximum number of threads

#define STACKSIZE 100 // number of 32-bit words in stack

void SetInitialStack(int i){

tcbs[i].sp = &Stacks[i][STACKSIZE-16]; // thread stack pointer

//r0-r3 r12,LR XPSR发生中断时自动压栈

Stacks[i][STACKSIZE-1] = 0x01000000; // thumb bit xPSR

Stacks[i][STACKSIZE-3] = 0x14141414; // R14 LR

Stacks[i][STACKSIZE-4] = 0x12121212; // R12 ip

Stacks[i][STACKSIZE-5] = 0x03030303; // R3

Stacks[i][STACKSIZE-6] = 0x02020202; // R2

Stacks[i][STACKSIZE-7] = 0x01010101; // R1

Stacks[i][STACKSIZE-8] = 0x00000000; // R0

//r4-r11要求程序处理

Stacks[i][STACKSIZE-9] = 0x11111111; // R11

Stacks[i][STACKSIZE-10] = 0x10101010; // R10

Stacks[i][STACKSIZE-11] = 0x09090909; // R9

Stacks[i][STACKSIZE-12] = 0x08080808; // R8

Stacks[i][STACKSIZE-13] = 0x07070707; // R7

Stacks[i][STACKSIZE-14] = 0x06060606; // R6

Stacks[i][STACKSIZE-15] = 0x05050505; // R5

Stacks[i][STACKSIZE-16] = 0x04040404; // R4

}

void OS_Launch(uint32_t theTimeSlice){

STCTRL = 0; // disable SysTick during setup

STCURRENT = 0; // any write to current clears it

SYSPRI3 =(SYSPRI3&0x00FFFFFF)|0xE0000000; // priority 7

STRELOAD = theTimeSlice - 1; // reload value

STCTRL = 0x00000007; // enable, core clock and interrupt arm

StartOS(); // 第一次启动一个线程

}

void Scheduler(void){

RunPt = RunPt->next; // Round Robin

}

  1. osasm.s

SysTick_Handler ; 自动保存 R0-R3,R12,LR,PC,PSR

CPSID I ; Prevent interrupt during switch

PUSH {R4-R11} ; 保存 r4-r11在马上成为旧线程的sp中

LDR R0, =RunPt ; R0=pointer to RunPt, old thread

LDR R1, [R0] ; R1 = 当前线程,也马上成为旧线程

STR SP, [R1] ; 保存马上成为旧线程的sp到TCB

PUSH {R0,LR} ; Scheduler会改变r0, LR,所以先保存(发生中断时LR=0xfffffff9,以 后要通过它触发中断返回)

BL Scheduler 找到下一个新线程

POP {R0,LR} 恢复r0, LR,

LDR R1, [R0] ; R1 = 新线程

LDR SP, [R1] ; 新的线程的 SP = RunPt->sp;

POP {R4-R11} ; 恢复r4-r11从新的线程的sp中

CPSIE I ; 9) tasks run with interrupts enabled

BX LR ; 10) LR=0xfffffff9触发中断返回,恢复 R0-R3,R12,LR,PC,PSR(注意这里恢复的PC,PSR是任务函数task()对应的地方,BX LR 后执行的就是恢复的PC所指的task里面地方,这样就继续从task里面执行)

StartOS

//R0=pointer to RunPt, old thread伪指令,调试时发现r0=0x0000044

//runPt=0x0000054 而且0x0000054中的内容为tcb[0]

LDR R0, =RunPt ; currently running thread

LDR R2, [R0] ; R2 = value of RunPt

LDR SP, [R2] ; new thread SP; SP = RunPt->stackPointer;

POP {R4-R11} ; 恢复 regs r4-11

POP {R0-R3} ; 恢复 regs r0-3

POP {R12}

ADD SP,SP,#4 ; 第一次,不需要返回,丢弃LR

POP {LR} ; 把task()函数地址推送给LR

ADD SP,SP,#4 ;第一次,丢弃 PSR

CPSIE I ; Enable interrupts at processor level

BX LR ; start first thread

ALIGN

END

相关文章:

RTOS之二环境搭建初识RTOS

参考:https://blog.csdn.net/kouxi1/article/details/123650688视频:https://www.bilibili.com/video/BV1b14y1c783/RTOS本质就是切换线程栈,栈换了环境就换了,一个重要的结构tcb(linux叫PCB或thread_info)…...

【Java】 JAVA Notes

JAVA语言帮助笔记Java的安装与JDKJava命名规范JAVA的数据类型自动类型转换强制类型转换JAVA的运算符取余运算结果的符号逻辑运算的短路运算三元运算符运算符优先级JAVA的流程控制分支结构JAVA类Scanner类Math 类random方法获取随机数Java的安装与JDK JDK安装网站:h…...

Java笔记-volatile和AtomicInteger

目录1. volatile1.1.什么是volatile1.2.JMM-Java内存模型2 验证volatile的特性2.1 可见性2.2.验证volatile不保证原子性2.3 volatile实现禁止指令重排序3.使用AtomicInteger解决volatile的不能实现原子性的问题3.2 AtomicInteger的方法说明:3.3 CAS3.4 应用1. volat…...

[标准库]STM32F103R8T6 高级定时器--PWM输出和带死区互补PWM输出

前言 STM32F103系列的MCU,相比普通的51单片机,在输出硬件PWM这个功能上要强不少,两者实现的方式都类似,都是通过一个定时器来启用硬件PWM输出,不过在输出PWM通道的数量上,32F103要强上不少。仅通过一个高级…...

Camtasia2023最新版电脑视频录屏记录编辑软件

在Mac或Wind上有各种可用的视频记录和编辑软件,其中Camtasia被称为视频记录器和视频编辑器。录屏软件Camtasia2023到底有什么特色功能?本文将帮助您选择理想的选择来开始视频捕获,创建和编辑。Camtasia2023是Mac/win平台上一款使用非常简单的…...

管理用户安全性

每个数据库用户帐户都包括以下项:唯一的用户名验证方法 默认表空间临时表空间用户概要文件初始使用者组帐户状态验证用户口令验证、外部验证、全局验证管理员验证操作系统安全性:• DBA 必须具有创建或删除文件的操作系统权限。• 普通数据库用户不应具有…...

分享113个JS菜单导航,总有一款适合您

分享113个JS菜单导航,总有一款适合您 113个JS菜单导航下载链接:https://pan.baidu.com/s/1d4nnh-UAxNnSp9kfMBmPAw?pwdcw23 提取码:cw23 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "http…...

RuoYi-Cloud 部署

RuoYi-Cloud部署 1. 下载 点击右侧链接可以进入gitee的源码下载地址: 偌依微服务源码gitee下载地址 2. 数据库部署 依据如下步骤创建系统所需数据环境,脚本执行没有先后次序要求: 在Mysql 中创建 ry-cloud 主数据库,并执行 …...

DockerFile文件详解

一、DockerFile文件说明1、概述 Dockerfile是用来构建Docker镜像的文本文件,文本内容包含了一条条构建镜像所需的指令、参数和说明。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。即:Dockerfile仅…...

Java程序运行机制

Java语言既具有编译型语言的特征,又具有解释型语言的特征,Java程序要经过先编译后解释两个阶段。高级语言的运行机制📍编译型语言使用专门的编译器,针对特定的平台(移植性差),将高级语言的源代码…...

LeetCode刷题------字符串

目录 LeetCode:344.反转字符串 LeetCode:541. 反转字符串II LeetCode:剑指Offer 05.替换空格 LeetCode:151.翻转字符串里的单词 LeetCode:剑指Offer58-II.左旋转字符串 LeetCode:28. 实现 strStr() …...

区块链技术与应用2——BTC-数据结构

文章目录比特币中的数据结构1. 区块链(block chain)2. 默克尔树(Merkle tree)3.哈希指针的问题比特币中的数据结构 1. 区块链(block chain) 哈希指针: (1)保存数值的位置…...

BiseNet v1论文及其代码详解

来源:投稿 作者:蓬蓬奇 编辑:学姐 BiSeNet v1说明: 文章链接:https://arxiv.org/abs/1808.00897 官方开源代码:https://github.com/CoinCheung/BiSeNet (本文未使用) 文章标题&am…...

(超详细)Navicat的安装和激活,亲测有效

步骤一:准备安装包 下载Navicat,我用的v15最好一致(私信可以发你安装包和注册码)步骤二:关闭杀毒软件,然后需要断掉网络(一定断网) 步骤三:一路next安装,安装…...

JDY-31蓝牙模块使用指南

前言 本来是想买个hc-05,这种非常常用的模块,但是在优信电子买的时候,说有个可以替代的,没注意看,买回来折腾半天。 这个模块是从机模块,蓝牙模块分为主机从机和主从一体的,主机与从机的区别就…...

【2023】华为OD机试真题Java-题目0211-租车骑绿道

租车骑绿道 题目描述 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、最大载重 M M M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。 输入描述 第一行两个数字 m m m、...

leetcode: 3Sum

leetcode: 3Sum1. 题目描述2. 思考3. 解题3. 总结1. 题目描述 Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i ! j, i ! k, and j ! k, and nums[i] nums[j] nums[k] 0. Notice that the solution set must not contain …...

【Python学习笔记】26.Python3 输入和输出(2)

前言 本章节继续介绍Python的输入输出。 文件对象的方法 本节中剩下的例子假设已经创建了一个称为 f 的文件对象。 f.read() 为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。 size 是一个可选的数字类型的…...

vue项目第二天

项目中使用element-ui库中文网https://element.eleme.cn/#/zh-CN安装命令npm install element-ui安装按需加载babel插件npm install babel-plugin-component -Dnpm i //可以通过npm i 的指令让配置刷新重新配置一下项目中使用element-ui组件抽离文件中按需使用element ui &…...

Python爬虫零基础到进阶(课程说明)

Python爬虫零基础到进阶 课程介绍总结 学—练—问 跟着学、多做多练、不懂就问、坚持就是胜利! 作业 飞书布置,作业提交放到群里,老师批改。 代码量 python基础: 十一次课,学会python。环境安装(了…...

用ChatGPT批量生成高互动Instagram内容:5步工作流+4类避坑红线(数据实测CTR提升217%)

更多请点击: https://intelliparadigm.com 第一章:用ChatGPT批量生成高互动Instagram内容:5步工作流4类避坑红线(数据实测CTR提升217%) 借助ChatGPT API 与 Instagram Graph API 的协同调度,可构建轻量级自…...

CxFlatUI——一款开源免费、现代化的 WinForm UI 控件库

文章目录一、前言二、项目概述三、应用场景四、功能模块五、功能特点六、功能演示七、源码地址一、前言 对于仍在使用 WinForms 技术栈构建企业内部系统、工具软件、桌面管理端、工业控制端或数据录入客户端的团队而言,传统 WinForms 默认控件在视觉表现、交互质感…...

Linux端口转发到外网完全教程:iptables DNAT+SNAT实现内网服务暴露

一、什么是外网端口转发Linux端口转发到外网,是指将Linux服务器上某个端口的流量,转发到外网(公网)的另一台服务器。这样做的典型场景是:你有一台内网服务器没有公网IP,但另一台海外服务器有公网IP&#xf…...

ARM MPMC内存控制器架构与优化策略

1. ARM MPMC内存控制器架构解析在嵌入式系统设计中,内存控制器作为处理器与存储设备之间的桥梁,其性能直接影响整个系统的运行效率。ARM PrimeCell多端口内存控制器(MPMC)是一种高度可配置的IP核,支持与多种类型存储设备的连接,包…...

搞懂这6个人工智能核心概念,再也不会被行业黑话难住

文章目录前言一、大模型(LLM):读遍天下书的超级学霸1. 到底什么是大模型?2. 大模型的“超能力”与“致命缺陷”二、微调(Fine-tuning):给学霸补专业课1. 微调到底在调什么?2. 2026年…...

别再只会用0填充了!Pandas DataFrame.fillna() 的6个高阶用法,数据分析师必看

别再只会用0填充了!Pandas DataFrame.fillna() 的6个高阶用法,数据分析师必看 在数据分析的日常工作中,缺失值处理就像是一道无法回避的数学题。许多刚入行的分析师会条件反射般地输入.fillna(0),这就像用创可贴处理所有伤口——有…...

数据库完整性约束与安全机制全解析

一、数据库完整性约束1、数据库完整性基本概念与核心机制(1)完整性定义与作用数据库完整性(Database Integrity)是指在任何情况下保证数据的正确性(Validity)和一致性(Consistency)&…...

MCP协议实战:用mcp-custom-dev构建AI助手专属工具链

1. 项目概述:一个为开发者赋能的MCP自定义开发工具最近在和一些做AI应用开发的朋友聊天,发现大家普遍遇到一个痛点:虽然现在大语言模型(LLM)的API调用很方便,但想把它们真正“嵌入”到自己的业务流程里&…...

EDA工具选型实战:从价格到价值的深度迁移指南

1. 从价格战到价值战:一次EDA工具市场策略的深度复盘十年前,当Altium宣布将其旗舰PCB设计软件Altium Designer的价格下调约75%时,整个电子设计自动化(EDA)圈子都炸开了锅。这无异于在由Cadence、Mentor Graphics&#…...

VSCode调试C++项目全攻略:从CMake工程配置到Native Debug实战(含传参技巧)

VSCode调试C项目全攻略:从CMake工程配置到Native Debug实战(含传参技巧) 在当今的C开发环境中,高效调试已成为提升生产力的关键环节。对于使用CMake管理的中大型项目,如何在VSCode中实现无缝调试体验,是许多…...