调度
调度初始化 根据支持的最大优先级,初始化不同的链表 123456789for (offset = 0; offset < RT_THREAD_PRIORITY_MAX; offset ++){ rt_list_init(&rt_thread_priority_table[offset]);} 初始化就绪优先级组 优先级>32, 初始化线程就绪表 位图 软件实现 RT-Thread的位图调度算法分析 一种新的高效的寻找字节最低非0位的有效算法 硬件实现 1234567891011121314151617181920212223__asm int __rt_ffs(int value){ CMP r0, #0x00 // 比较寄存器r0和0,设置条件标志 BEQ exit // 如果r0等于0(即输入值为0),则跳转到exit标签 RBIT r0, r0 // 反转r0中的位,最低位变为最高位,最高位变为最低位 CLZ r...
预编译命令
预编译命令123456789101112131415161718192021#define __RT_STRINGIFY(x...) #x#define RT_STRINGIFY(x...) __RT_STRINGIFY(x)#define rt_section(x) __attribute__((section(x)))#define rt_used __attribute__((used))#define rt_align(n) __attribute__((aligned(n)))#define rt_weak __attribute__((weak))#define rt_typeof __typeof__#define rt_noreturn __attribute__ ((noreturn))#define rt_inline ...
waitqueue
waitqueue初始化12345678910111213rt_inline voidrt_wqueue_init(rt_wqueue_t *queue){ RT_ASSERT(queue != RT_NULL); queue->flag = RT_WQ_FLAG_CLEAN; // 将队列设置为可插入状态 rt_list_init(&(queue->waiting_list)); // 初始化链表节点} 加入队列线程加入队列有两种方式: 阻塞式加入:这种方式类似于信号量的用法,当参数condition为 0 时,线程会被阻塞,并将含有线程信息的等待节点加入到等待队列中。 123intrt_wqueue_wait(rt_wqueue_t *queue, intcondition, intmsec) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484...
fatfs
fatfs[TOC] 硬盘的物理结构:概述 盘片(platter) 磁头(head) 磁道(track) 扇区(sector) 柱面(cylinder) 盘片 片面 和 磁头硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。如下图: 图1 扇区 和 磁道下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图中绿色部分),对于老式磁盘,每个扇区存储容量是相同的(也就是每个磁道的容量是相同的,但不同磁道的数据密度是不同的,半径越小的磁道的密度越大,这个是怎么做到的,还不清楚,但我个人猜测是因为旋转角度,转动相同的角度,外部扇区移动的距离更长,而内部扇区移动距离短,就是通过磁头每次移动是固定角度的,但由于磁臂的长度不同,分别对应不同的磁道,那对于外围的扇区,由于磁臂较长,每次移动固定角度,则划过的...
ARM指针寄存器
ARM指针寄存器 https://blog.csdn.net/zhuguanlin121/article/details/120883025 -堆栈指针r13 SP:每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。 栈顶指针(Stack Pointer)是寄存器页的核心,用以指向系统栈的栈顶位置,某些情况下也可以作为通用寄存器来使用,例如,在 ARM Cortex M 内核中,SP 可以作为 R13 来使用。由于栈是函数式语言的核心,在操作系统中 SP 的地位举足轻重,以 RT-Thread 为例,每个用户任务都有独享的栈,任务的切换几乎就是栈的切换,也就是栈顶指针的切换,我们可以毫不夸张的说:栈顶指针就是每个任务的生命线。 -连接寄存器r14 LR:每种模式下r14都有自身版组,它有两个特殊功能。 (1)保存子程序返回地址。使用BL或BLX...
CAN驱动
CAN驱动CAN驱动框架CAN初始化-rt_hw_can_register注册CAN设备,并初始化互斥量 -rt_timer_init初始化CAN定时器,注册定时器回调函数 cantimeout 初始化&&配置 RT_CAN_CMD_SET_PRIV 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960if (can->config.privmode) { for (i = 0; i < can->config.sndboxnumber; i++) { level = rt_hw_interrupt_disable(); if(rt_list_isempty(&tx_fifo->buff...
DFS
DFS 虚拟文件系统https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/filesystem/filesystem 123456789101112131415161718FatFS 是专为小型嵌入式设备开发的一个兼容微软 FAT 格式的文件系统,采用 ANSI C 编写,具有良好的硬件无关性以及可移植性,是 RT-Thread 中最常用的文件系统类型。传统型的 RomFS 文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(execute In Place,片内运行) 方式运行,在系统运行时, 节省 RAM 空间。Jffs2 文件系统是一种日志闪存文件系统。主要用于 NOR 型闪存,基于 MTD 驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃 / 掉电安全保护,提供写平衡支持等。DevFS 即设备文件系统,在 RT-Thread 操作系统中开启该...
I2C驱动
I2C驱动 https://www.i2c-bus.org/i2c-primer/termination-versus-capacitance/ 硬件电路 I2C 总线使用 SDA 和 SCL 传输数据和时钟。首先要意识到:SDA 和 SCL 是开漏(在 TTL 世界中也称为开集),也就是说 I2C 主设备和从设备只能将这些线路驱动为低电平或保持开路。如果没有 I2C 设备将其拉低,终端电阻Rp 会将线路拉高至 Vcc。这允许同时操作多个 I2C 主设备(如果它们具有**多主设备功能)或拉伸(从设备可以通过按住 SCL 来减慢通信速度)等功能。 终端电阻 Rp 与线路电容 Cp 一起影响 SDA 和 SCL 上信号的时间行为。虽然 I2C 设备使用开漏驱动器或 FET 拉低线路(通常可以驱动至少约 10mA 或更多),但上拉电阻 Rp 负责将信号恢复到高电平。Rp 通常在 1 kΩ 至 10 kΩ 之间,导致典型的上拉电流约为 1 mA 或更小。这就是 I2C 信号具有锯齿状外观的原因。事实上,每个“齿”在上升沿显示线路的充电特性,在下降沿显示放电特性。 SDA(上)和 SC...
IDLE线程
IDLE线程 cleanup 会在线程退出时,被空闲线程回调一次以执行用户设置的清理现场等工作。 defunct流程 rt_thread_defunct_enqueue 将退出线程和分离线程插入到defunct链表中 IDLE线程会在空闲时,执行defunct链表中的线程,将线程节点从链表中移除 从对象容器中移除线程对象 执行线程清除函数,释放线程控制块
PM电源管理
PM电源管理初始化drv_pm_hw_init -> rt_system_pm_init 1234567891011121314/* initialize timer mask */timer_mask = 1UL << PM_SLEEP_MODE_DEEP;/* when system power on, set default sleep modes */pm->modes[pm->sleep_mode] = 1;pm->module_status[PM_POWER_ID].req_status = 1;pm->run_mode = RT_PM_DEFAULT_RUN_MODE; pm设备注册12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182/** * Register a...