系统定时器
系统定时器跳跃表 跳跃表是一种“随机”的数据结构,在很大的可能性下,它会得到O(log(N))的时间复杂度,而旧的列表得到O(N)。此外,当将RT_TIMER_SKIP_LIST_LEVEL设置为1时,它将与旧的双链表相同,无论是时间还是空间复杂性。基准测试表明,当RT_TIMER_SKIP_LIST_LEVEL为3时,当有100个计时器时,随机插入新计时器的平均时间比旧计时器快2倍,当有200个计时器时快3倍。但是,它恢复已弃用的函数rt_system_timer_init。bsp必须在系统启动时调用它。 定时器跳表 (Skip List) 算法在前面介绍定时器的工作方式的时候说过,系统新创建并激活的定时器都会按照以超时时间排序的方式插入到 rt_timer_list 链表中,也就是说 t_timer_list 链表是一个有序链表,RT-Thread 中使用了跳表算法来加快搜索链表元素的速度。 跳表是一种基于并联链表的数据结构,实现简单,插入、删除、查找的时间复杂度均为 O(log n)。跳表是链表的一种,但它在链表的基础上增加了 “跳跃” 功能,正是这个功能,使得在查找元素...
线程
线程线程创建 初始化上下文信息 将栈初始化为 #号 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit){ struct stack_frame *stack_frame; rt_uint8_t *stk; unsignedlong i; stk = stack_addr + sizeof(rt_uint32_t); ...
调度
调度初始化 根据支持的最大优先级,初始化不同的链表 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...
链接文件
链接文件参考链接https://home.cs.colorado.edu/~main/cs1300/doc/gnu/ld_toc.html _stext 和 _etext stext 和 _etext 符号通常用于表示内核代码段的开始和结束位置。 1234//定义了一个符号。这个符号的值等于当前的位置计数器(.),也就是 .text 段的起始地址。_stext = .;//定义了一个符号。这个符号的值等于当前的位置计数器(.),也就是 .text 段的结束地址。_etext = .; “.”与”*符号作用1234567891011121314151617SECTIONS{ . = 0x10000; .text : { *(.text) } . = 0x8000000; .data : { *(.data) } .bss : { *(.bss) }} 第一行设置了特殊符号’.’,这是位置计数器。如果您没有以其他方式指定输出部分...
预编译命令
预编译命令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 ...
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 操作系统中开启该...
FINSH模块
FINSH模块MSH初始化 根据链接脚本指明FINSH使用内存空间 _syscall_table_begin _syscall_table_end的地址 FSymtab段1234. = ALIGN(4);__fsymtab_start = .;KEEP(*(FSymTab))__fsymtab_end = .; __fsymtab_start和 __fsymtab_end用于指明finsh使用内存 FSymTab用于存放所有注册命令的结构体 struct finsh_syscall,包括命令名称,命令选项,命令描述,命令函数执行地址信息 宏12345678910111213141516171819202122232425262728293031/** * @ingroup msh * * This macro exports a command to module shell. * * @param command is the name of the command. * @param desc is the description of the command, wh...








