内联汇编
发表于|更新于
|总字数:6|阅读时长:1分钟|浏览量:
文章作者: Reglucis
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Reglucis' Blog!
相关推荐
2025-12-28
STM32再认识 - (0)序言
STM32再认识 俱怀逸兴壮思飞,欲上青天揽明月 对我个人而言,几乎没有完整系统的学习过 STM32 (准确的说是任何编程语言/计算机课程)。 从来都是凭借着一点点可笑的小聪明按照直觉在写代码,形容一下的话就是,那些问题的答案不是睁开眼睛就能看到嘛。若是有问题就去翻手册、找博客,在东拼西凑下,知识体系算是勉强建立起来了。最起码远比某些在B站上的主流教程是强的。 但现在,我希望能够解决一些更复杂的系统问题。知识体系残缺的弊端就被暴露出来了,因此,借此机会,我决定系统整理一下 STM32 相关的知识体系,更准确地说,是 Cortex-M 系列的内核。 本篇笔记的姊妹篇《YueOSKernal 开发日志》可能在一段时间内都不会公开。简单来说,YueOSKernal 目的在于开发一款足够轻量的操作系统内核,在近乎于裸机的效率下,实现一些多任务调度功能,主要用于边缘系统(如电机控制)。 主要文献 参考文献主要来自于 ARM 公司的文档,其次是 ST 公司 F4 系列的手册,最后是一些书籍。详情可以参照各个章节最后的部分。 主要的实验平台为 STM32F407 。
2025-12-28
STM32再认识 - (1) Cortex®-M4
Cortex®-M4 处理器 Cortex®-M4 处理器介绍 Cortex-M4 处理器是一款专为微控制器市场设计的高性能 32 位处理器。其显著优点包括: • 出色的处理性能与快速中断处理相结合 • 通过广泛的断点和跟踪功能增强系统调试 • 高效的处理器内核、系统和存储器 • 超低功耗,集成睡眠模式和可选的深度睡眠模式 • 平台安全稳健,具有可选的集成内存保护单元(MPU) Cortex-M4 处理器基于高性能处理器内核构建,采用 3 级流水线哈佛架构,非常适合要求苛刻的嵌入式应用。该处理器通过高效的指令集和广泛优化的设计提供卓越的功效,提供高端处理硬件,包括可选的符合 IEEE754 标准的单精度浮点计算、一系列单周期和 SIMD 乘法以及累加乘法功能、饱和算术和专用硬件除法。 Cortex-M3: 针对低功耗微控制器设计的处理器,面积小但是性能强劲,支持可以处理器快速处理复杂任务的丰富指令集。具有硬件除法器和乘加指令(MAC).并且,M3支持全面的调试和跟踪功能,使软件开发者可以快速的开发他们的应用 Cortex-M4: 不但具备Cortex-M3的所有功能,并...
2026-01-02
YueOS 开发日志 (1) - 内核篇:基础概念
基础结构 本系列属于开发日志,随着开发的深入某些概念/思想可能发生改变。因此,一旦发生前后文冲突,以后文为准;笔者会尽可能标注出准确定义的位置。 HAL 库标准启动流程 当系统上电时,由 reset 异常触发异常处理。 1.1. CortexM4 内核自动从 0x00000000 处读取异常向量表首地址(一般为 0x08000000),即 *__initial_sp 1.2 将 MSP 置位后,继续从向量表中读取并置位 PC 初值。(一般表现为进入 startup.s) 注意: 笔者在 Ozone 调试时发现复位后有 SP=0x2000 3E30, PC=0x0800 03C4; 同时命令行输出为: Target.ReadU32 (0x08000000); // returns 0x4, data is 0x20003E30 Target.SetReg (“SP”, 0x20003E30); Target.ReadU32 (0x08000004); // returns 0x4, data is 0x80003C5 Target.SetReg (“PC”, 0x...
2026-01-04
YueOS 开发日志 (2) - 内核篇:任务与调度
任务与调度 尽可能梳理成分类讨论了,笔者自己的思考过程耦合性有亿点点高。 任务的分类 任务划分结构可以被嵌套表示为 异常任务(中断任务) 词如其意。在内核 Handler Mode 处理的任务被称为异常任务。 线程任务 与上文类似的,在内核 Thread Mode 处理的任务被称为线程任务。线程任务按重要程度又可划分为 重要任务 次要任务 内核任务 重要程度划分的定义参见前文。 综上,调度策略的分析中一共存在四种任务: 异常任务 重要任务 次要任务 内核任务 后三者被合称为线程任务。 上下文切换 从逻辑上看,在某一时刻时内核处理的任务发生了改变的动作被称为任务的上下文切换。 从动作上看,在某一时刻时内核的堆栈指针被手动修改称为任务的上下文切换。 在任一时刻,可能发生的上下文切换无非以下两种情况 主动切换 即当前任务主动触发上下文切换。 被动切换 即当前任务因操作系统内核/处理器内核调度而被动发生上下文切换。 调度策略 由顶向下划出大纲后,当然是自底向上具体分析。 约定 0: 在宏观上来看,所有需要执行的任务一定都是可以在其超时...
2026-01-05
YueOS 开发日志 (3) - 内核篇:OS API
操作系统函数的调用接口 约定:非特权级称为用户态,特权级称为内核态。且为了安全性保证,系统初始化之后一定是使用 PSP 的用户态。 OS API 的调用 由于种种原因,用户很多时候无法执行 OS API。因此在用户态下试图访问某些系统功能,就需要使用 SVC 来向内核提出申请,并在 SVC_Handler 中实现要求。 嗯,挺好的。但是,理想很丰满,现实很骨感。这里有些细节需要考虑。 如何完成 SVC 到系统具体服务的映射? 如何实现一个统一、易于阅读且简洁优雅的 SVC 封装?(不会有人想挨个手撸汇编吧?写几行性能关键语句就得了) 如何保证 OS API 调用是可靠的?用户在中断中调用 SVC 那不炸了吗? SVC 调用下的 OS API 当发起 SVC 请求时,一共存在 256 个被内核忽略的立即数。简单的方式是为每一个 SVC 服务分配一个立即数,但这略麻烦,我懒。 所以使用指针传递的方式。由 ARM ABI 约定易知,应该使用 R0-R3 完成实参传递且使用 R0 传回返回值,同时使用 R12 传递实调函数。 我们使用 0 号 SVC 服务作为内核调用入口,余下...
2026-01-08
YueOS 开发日志 (4) - 内核篇:任务的具体实现
任务的具体实现 任务的数据结构是一切的基础。 任务管理器 调度器可调度的任务都需要先使用任务管理器向内核注册。注册后的任务,任务管理器自身会维护一个链表,该链表保存着全部任务。 任务注册 任务注册时,用户需要使用结构 ‘Task_InitConfig_t’ 提供任务的基础信息。 12345678910111213typedef struct { /* 不允许为空 */ Task_Handle_t entryPoint; // 任务的入口点 Kernal_TaskType_e type; // 任务类型,即前文中的四种,用户只关心重要和次要任务即可 uint8_t priority; // 任务的优先级,被次要任务使用 uint32_t* stackAddr; // 堆栈起始地址(最大栈顶) 栈底需要 8 byte 对齐 uint32_t stackSize; // 单位: byte 推荐 4 的倍数 /* 可选 */ void* argv; // 在入口点传入的参数 const ch...
公告
欢迎来访我的博客。这里记录着菜猪的学习日志。
