命名约定
发表于|更新于
|总字数:6|阅读时长:1分钟|浏览量:
文章作者: Reglucis
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Reglucis' Blog!
相关推荐
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...
2026-01-08
YueOS 开发日志 (5) - 内核篇:调度器的具体实现
调度器的具体实现 调度器将是整个系统中最核心的功能。调度器操作的实例对象为任务,向上拓展为进程间同步模块。可以说调度器封装设计的优秀与否将成为影响整个系统性能关键。 整个时间轴由无数个任务片构成,两个重要/次要任务之间的缝隙被调度任务填充。因此必须尽可能减小调度任务的长度。 本系统的核心需求依然是将重要任务之外的时间合理高效利用,并不强调实时性,因此不适用 Round-Robin(RR) 方法。 被调度任务的排序算法 关于任务的排序方法,对于 cortex-M 系列同时运行任务最多也就十余个。此时,对于时间复杂度 O(n) 与 O(log(n)) 无明显差距。因此,不使用 AVL 及红黑树类的排序方法,仅使用其退化的最简单模型 —— 有序链表。 定义:按某种方式排序的任务链表称为任务链。 就绪任务链:按照执行顺序排序的待执行任务。 包含重要任务链(静态调度表)与次要任务链(优先度表)。 延时任务链:按照恢复时间顺序排序的被阻塞任务。 挂起任务链:按照时间顺序排序的被挂起任务链。(其实就是无序的🤐。。。凑个定义好处理,嘿嘿嘿嘿) 调度的排序特点 考虑所有发生当...
2026-01-08
YueOS 开发日志 (6) - 内核篇:时钟与阻塞
时钟与阻塞 硬件时钟 我们使用的硬件为内核计数器。 SysTick: The RCC feeds the external clock of the Cortex System Timer (SysTick) with the AHB clock (HCLK) divided by 8. The SysTick can work either with this clock or with the Cortex clock (HCLK), configurable in the SysTick control and status register. [STM32F4xx Reference manual(RM0090Rev20)] When enabled, the timer counts down from the value in SYST_CVR. When the counter reaches zero, it reloads the value in SYST_RVR on the next clock edge. It then decrements ...
公告
欢迎来访我的博客。这里记录着菜猪的学习日志。
