Sourcelink

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

详解Linux内核kobject模型

一. 概述 在看linux的设备模型发现kobject在很多地方都有使用, 经过分析发现它非常经典的实现了面向对象; 接下来分别先解释下kobject等结构体的概念; 1.1 kobject kobject是一个结构体, 它的结构体声明如下: struct kobject { const char *name; // 设备的名称 struct list_h...

linux内核之initcall机制

一. 概述 引入问题: initcall机制是做什么的?它有哪些功能? 回顾昨天的 machie_desc, 其中init_machine是在哪被调用的? 查看发现是在如下函数被调用: static int __init customize_machine(void) { /* * customizes platform devices, or adds new ones ...

linux内核之machine_desc获取

一. 概述 板子: imx6ul 内核版本:linux4.1.15 宿主机:ubuntu16.04 machine_desc主要是对板子的一个特性,比如init_machine()和init_irq(), 这些都是它所具有的功能,不同厂家的板子这些初始化是不同的; 二. machine_desc的构造 DT_MACHINE_START(IMX6UL, "Freescale i...

【从零开始写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...