Sourcelink

写过单片机,焊过BGA,睡过实验室,炸过小电容

【从零开始写RTOS】st-link进行gdb调试

一. 建立监听 st-util -p 4500 -p是为指定监听端口 二. 启动gdb arm-none-eabi-gdb bin/demo_proc_manager.elf 三. 建立目标 target extended-remote :4500 四. 再次更新板载程序 load 程序来源bin/demo_proc_manager.elf 示意图: 五. 命...

【从零开始写RTOS】进程退出处理

一. 原因 根据上节调试结果,我们知道进程在退出以后产生了异常, 原因是返回后进程跳转到了异常的地方; 上节分析的记录: 二. 对策 所以我们现在需要来解决该问题,我们为所有的进程退出做一个统一的处理, 需要做到如下几点: 清楚进程存储表 将进程从就绪表中移除 ...

【从零开始写RTOS】系统启动第一个进程

一. 准备工作 1.1 初始化 void kos_sys_init(void) { /* 1. 初始化就绪队列 */ kos_rq_init(); /* 2.初始化启动标志 */ kos_running = 0; /* 3. 空闲进程的创建 */ _idle_proc_create(); } 1.2 空闲进程实现 void *kos_...

【从零开始写RTOS】进程调度

一. 调度原理 实质是触发一个上下文切换 port_os_ctxsw: push {r4, r5} ldr r4, =NVIC_INT_CTRL ldr r5, =NVIC_PENDSVSET str r5, [r4] pop {r4, r5} bx lr 会引发一个服务函数PendSV_Handler,...

【从零开始写RTOS】进程创建

一. 需求 1.进程堆栈指针 进程优先级 进程的操作链表 进程状态 进程名 休眠链表 进程休眠时间 进程ID 二. 进程结构体 struct kos_proc { unsigned int *stack_pointer; struct list_head slot_list; ...

【从零开始写RTOS】优先级就绪队列

一. 最高优先级获取 策略: 每次需要调度最高优先级就绪进程运行; 所以, 需要解决查找最高优先级进程的问题; find first bit in word static __always_inline unsigned long __ffs(unsigned long word) { int num = 0; #if BITS_PER_LONG == 64 i...

【从零开始写RTOS】内核双向链表

一. 数据结构 1.1 成员 struct list_head { struct list_head *next, *prev; }; 示意图如下: 1.2 初始化 静态初始化 #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct lis...

【从零开始写RTOS】VSCODE开发STM32

一. 构建 先生成makefile cmake .. -DBOARD_FAMILY=NUCLEO_STM32F746ZG 其中-DBOARD_FAMILY=NUCLEO_STM32F746ZG是为了指定对应的board; 编译makefile make 输出日志: Scanning dependencies of target arch [ 10%] Bui...

【从零开始写RTOS】内核调度

一. 临界区 在rtos中,进入临界区的实质是关闭中断(可配置优先级的),退出临界区就是开启中断(但是原先系统中断是关闭的情况下无需开启) 修改后: unsigned int port_enter_critical(void) { unsigned int ret = port_cpu_primask_get(); port_cpu_int_disable(); ret...

【从零开始写RTOS】汇编语言

一. 环境 开发环境: linux 汇编:gcc 二. 指令 .equ 类似#define , 常量符号 exp: .equ NVA 0x10000 .text 声明接下来的代码都是放在text段(可以去看下链接文件) .align 4 变量的对齐宽度 .thumb 表示接下来都使用汇编为thumb指令 .syntax...