昌维的博客 — 记录 AI、系统与工程的实践笔记
正在加载首页内容
正在加载首页内容
共 5 篇文章
sleep() 在不同语言里由不同的库提供,可它本身究竟是怎么实现的?这篇从单片机的软件延时、硬件定时器延时之间的取舍讲起,再落到 ez-rtos 里基于 nowtick 和时基列表的实现,看看一个任务睡着的时候,CPU 是怎么被让出去给别的任务的。
上一章写完了任务切换器,但翻遍代码也没看到有人调用 PendSVHandler。这篇就来回答这个悬念:Cortex-M3 内核级的 SysTick 如何定时触发,为什么工业级 OS 不直接在 SysTick 里切换任务,而要再绕一层 PendSV 可悬起中断,以及「中断共振」是怎么被避开的。
一个 main() 函数只能顺序执行,那多个任务「同时」跑是怎么做到的?这篇拆开 ez-rtos 的任务切换器:为什么要先引入 idle 任务、Cortex-M3 的 MSP/PSP 双栈与中断自动压栈是怎么一回事,然后逐段读 PendSVHandler 的汇编,看清楚保存上下文、选下一个任务、恢复上下文这三步。
单片机上电之后,CPU 第一件事到底做了什么?这篇沿着 Cortex-M3 的启动流程走一遍:从内存 0x00000000 处的栈顶指针与 ResetHandler,看官方 startup 文件里的 ARM 伪指令、SystemInit 对时钟的配置,再到 main() 里 osinit() 与 osstart() 组成的那段 bootloader,顺便聊一...
《从零开始写一个操作系统》这个系列,我会用自己写的 ez-rtos 当案例,讲清楚一个操作系统到底是怎么跑起来的。第一篇先补齐背景:CPU、指令集、指令集架构、微架构、单片机分别指什么,为什么选 STM32F103 和 Cortex-M3 而不是 X86,最后把 Keil 5 的编译与仿真环境跑通,看到 GPIO 电平在仿真里跳动。