- 博客(29)
- 收藏
- 关注
原创 RT-Thread内核组成——中断管理
请注意代码后面的 [WEAK] 标识,它是符号弱化标识,在 [WEAK] 前面的符号(如 NMI_Handler、HardFault_Handler)将被执行弱化处理,如果整个代码在链接时遇到了名称相同的符号(例如与 NMI_Handler 相同名称的函数),那么代码将使用未被弱化定义的符号(与 NMI_Handler 相同名称的函数),而与弱化符号相关的代码将被自动丢弃。这样在发生中断嵌套,或屏蔽了相应中断源的过程中,不会耽误嵌套的其他中断处理过程,或自身中断源的下一次中断信号。
2025-05-25 16:58:17
769
原创 RT-Thread内核组成——内存管理
2)随着内存不断被分配和释放,整个内存区域会产生越来越多的碎片(因为在使用过程中,申请了一些内存,其中一些释放了,导致内存空间中存在一些小的内存块,它们地址不连续,不能够作为一整块的大内存分配出去),系统中还有足够的空闲内存,但因为它们地址并非连续,不能组成一块连续的完整内存块,会使得程序不能申请到大的内存。当一个内存池对象被创建时,内存池对象就被分配给了一个内存池控制块,内存控制块的参数包括内存池名,内存缓冲区,内存块大小,块数以及一个等待线程队列。内存堆管理器可以分配任意大小的内存块,非常灵活和方便。
2025-05-17 16:01:41
771
原创 RT-Thread内核组成——线程间通信
邮箱服务是实时操作系统中一种典型的线程间通信方法。举一个简单的例子,有两个线程,线程 1 检测按键状态并发送,线程 2 读取按键状态并根据按键的状态相应地改变 LED 的亮灭。这里就可以使用邮箱的方式进行通信,线程 1 将按键的状态作为邮件发送到邮箱,线程 2 在邮箱中读取邮件获得按键状态并对 LED 执行亮灭操作。这里的线程 1 也可以扩展为多个线程。例如,共有三个线程,线程 1 检测并发送按键状态,线程 2 检测并发送 ADC 采样信息,线程 3 则根据接收的信息类型不同,执行不同的操作。RT-Thre
2025-05-17 15:37:21
1011
原创 RT-Thread内核组成——线程间同步
优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。信号量工作示意图如下图所示,每个信号量对象都有一个信号量值和一个线程等待队列,信号量的值对应了信号量对象的实例数目、资源数目,假如信号量值为 5,则表示共有 5 个信号量实例(资源)可以被使用,当信号量实例数目为零时,再申请该信号量的线程就会被挂起在该信号量的等待队列上,等待可用的信号量实例(资源)。
2025-05-17 15:00:02
748
原创 RT-Thread内核组成——时钟管理
如下图所示,系统当前 tick 值为 20,在当前系统中已经创建并启动了三个定时器,分别是定时时间为 50 个 tick 的 Timer1、100 个 tick 的 Timer2 和 500 个 tick 的 Timer3,这三个定时器分别加上系统当前时间 rt_tick=20,从小到大排序链接在 rt_timer_list 链表中,形成如图所示的定时器链表结构。RT-Thread 定时器默认的方式是 HARD_TIMER 模式,即定时器超时后,超时函数是在系统时钟中断的上下文环境中运行的。
2025-05-14 22:13:00
929
原创 RT-Thread内核组成——线程管理
若某线程运行完毕,系统将自动删除线程:自动执行 rt_thread_exit() 函数,先将该线程从系统就绪队列中删除,再将该线程的状态更改为关闭状态,不再参与系统调度,然后挂入 rt_thread_defunct 僵尸队列(资源未回收、处于关闭状态的线程队列)中,最后空闲线程会回收被删除线程的资源。在执行完毕后,线程将被系统自动删除。,这两类线程都会从内核对象容器中分配线程对象,当线程被删除时,也会被从对象容器中删除,如下图所示,每个线程都有重要的属性,如线程控制块、线程栈、入口函数等。
2025-05-11 22:12:21
590
原创 RT-Thread内核组成——内核基础
邮箱效率较消息队列更为高效。是可执行映像文件烧录到 STM32 后的内存分布,它包含 RO 段和 RW 段两个部分:其中 RO 段中保存了 Code、RO-data 的数据,RW 段保存了 RW-data 的数据,由于 ZI-data 都是 0,所以未包含在映像文件中。线程是 RT-Thread 操作系统中最小的调度单位,线程调度算法是基于优先级的全抢占式多线程调度算法,即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。
2025-05-11 21:16:46
955
原创 RTOS优先级翻转
优先级反转(Priority Inversion)是实时操作系统(RTOS)中一种资源竞争引发的调度异常现象,可能导致高优先级任务被低优先级任务阻塞,从而违反实时性要求。机制:当高优先级任务(A)等待低优先级任务(C)持有的资源时,临时将C的优先级提升至与A相同。涉及三个及以上不同优先级的任务:例如任务A(最高)、任务B(中)、任务C(最低)。中间优先级任务的介入:任务B抢占任务C,导致任务C无法释放资源,间接阻塞任务A。结果:任务A(最高优先级)实际上被任务B(中优先级)阻塞,优先级顺序被“反转”。
2025-05-11 15:23:28
336
原创 STM32无限循环进入i2c事件中断卡死线程调度
在开发项目中遇到RTT线程不调度的问题,现象是出现i2c报错,线程不调度,只响应中断。问题是随机小概率出现,我们提出的几个推测点:1.栈溢出2.最高优先级的线程中有死循环3.进入临界区关了调度锁4.死锁5.关RT中断注:不要因为看了标题而先入为主1.栈溢出因为RTT没有FreeRTOS那样的API接口(或许我们没有找到),只能打印线程信息,栈起始地址、sp指针(可知道已使用栈大小)、优先级(担心优先级反转),时间片等。void rt_memory_info(rt
2022-05-30 18:21:16
3824
2
原创 STM32进入HardFault快速定位问题
基于RT-thread,STM32硬件平台。在项目开发过程中遇到了程序进入hard fault的异常,通过查看pc寄存器和lr寄存器快速定位到出问题位置(函数)。STM32出现硬件错误可能有以下原因:1.内存溢出,访问越界;2.堆栈溢出;3.中断处理错误;在RTT系统中,当系统出现hard fault异常时,程序会进入RTT提供的下面这个接口void rt_hw_hard_fault_exception(struct exception_info *exception_info)
2022-05-30 16:07:15
2637
原创 使用Wi-Fi实现ESP32与手机网络助手进行TCP数据收发
在ESP32板块,开发环境搭建完成的基础上,做一个简单的TCP客户端与服务器端的数据收发实验,开发环境是基于乐鑫官方IDF,Linux环境下发开,本实验有助于对例程的理解和应用。实验前期准备:在手机上下载一个“网络调试助手”APP,并做如下设置。1.Server地址为自动分配2.设置手机为Server3.设置端口号8080,可设置其他实验总体概述:Step1:ESP32 Wi-Fi设置为STA模式,将其连接到路由器(AP)上Step2:使用IPv4,TCP协议,ESP32作为
2020-05-25 17:57:14
10690
2
原创 驱动开发之始,(六)Linux内核时间,延迟操作
时钟中断由系统定时硬件周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数。定义在<asm-genric/param.h>中(每个人下载的内核版本不同可能位于不同的文件下)。每次当时钟中断发生时,内核内部计数器的值就增加一。这个计数器的值在系统引导时被初始化为0。因此,它的值就是自上次操作系统引导以来的时钟滴答数,成为“jiffies_64”。1.使用j...
2020-04-06 17:28:48
280
原创 驱动开发之始,(五)异步通知
情形分析:一个进程需要从外设读取采集到的数据进行处理,如果有新的数据到来,应用程序可以周期性地调用poll来检查数据,但是这样做的效率并不高。因此,通过使用异步通知,应用程序可以在数据可用时收到一个信号,转而进行处理,而不需要不停的使用查询的方式来检查有无新数据的到来。为了启用文件的异步通知机制,应用程序执行以下三个步骤:step1:指定一个进程作为文件的“属主(owner)”(在file...
2020-04-06 14:07:34
148
原创 驱动开发之始,(四)阻塞型I/O,进程休眠
在前面的章节中,我们讲述了read和write方法。当数据不可用时,用户调用read,或者用户使用写入数据,但输出缓冲区已满,驱动程序该如何相应呢?在这种情况下,驱动程序应该(默认)阻塞该进程,将其置入休眠状态直到请求可继续。1.休眠(sleep)当一个进程被置入休眠时,它会被标记为一种特殊状态并从调度器的运行队列中移走,休眠中的进程会被搁置在一边,等待将来的某个事件发生,直到某些情况下修...
2020-04-05 20:52:07
357
原创 驱动开发之始,(三)并发与竞态,信号量与自旋锁
1.并发与竞态在单处理器结构中,各个进程从宏观上看是并行的,因为处理器执行速度非常快,但从微观上看进程是串行执行,因为在一个时刻只有一个进程能被处理器运行,称为并发。换句话说,在一段时间内,处理器能够同时做多件事。举个例子,A进程先在CPU上得到执行,突然被B进程打断(硬件中断或拥有更高优先级),CPU此刻暂时放下A进程,转而为B进程服务,当B进程服务完成后,在接着执行A进程,从这一段时...
2020-04-05 17:03:34
188
原创 驱动开发之始,(二)字符设备驱动——Part3 简单的字符驱动实例
通过前面两章的知识汇总,我们了解字符设备驱动框架及其涉及的几个重要数据结构,为了加深理解,本章用一个简单的实例来演示字符设备驱动的开发过程,因为没有实际接硬件,并未实现对驱动进行复杂操作,在此只做一个初步认识,在后续的进阶部分,笔者再通过实际的字符驱动来进一步分析。1.字符设备驱动 hello_module.c#include <linux/init.h>#include ...
2020-04-04 18:18:56
205
原创 驱动开发之始,(二)字符设备驱动——Part2 file_operations,file和inode结构
上一章中,讲到字符设备驱动模型,了解了字符驱动的框架。为了更好的理解驱动程序,本章讲述其中涉及的三个重要数据结构,file_operations、file和inode结构。1.文件操作file_operationsfile_operations结构是用来建立驱动程序与设备间的连接,该结构定义在<linux/fs.h>,其中包含了一组函数指针。每个打开的文件(在内部由一个file...
2020-04-04 16:11:47
242
原创 驱动开发之始,(二)字符设备驱动——Part1驱动模型
字符设备驱动将会分为三个部分,Part1:宏观上了解驱动模型,Part2:具体分析其中重要的三个数据结构,文件操作集file_operations,文件file以及inode结构。Part3:用一个简单的实例来演示字符设备驱动的实现字符设备是面向字节流的方式,一个字节一个字节传输数据的设备,通常是按照先后顺序传递,常见的字符设备有鼠标、键盘、串口等设备。对字符设备的访问是通过文件系统内的设...
2020-04-01 21:29:22
211
原创 驱动开发之始,(一)Hello World内核模块
在上一篇中,我们编译了自己的主线内核,建议读者在source insight中建立内核源码工程。现在我们开始学习第一个内核模块,有一个初步的感性认识。驱动程序在Linux内核里扮演着特殊的角色,它们就像“黑盒子”, 操作底层硬件而定义好的内部接口,它们完全隐藏了设备工作的细节。用户的活动通过一套标准化的调用来进行;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上。Hel...
2020-03-28 14:24:42
268
原创 驱动开发之始,简单的编译自己的主线内核
从kernel.org的镜像网站上获得一个“主线”内核,并安装到自己的系统中,下面为kernel网址https://www.kernel.org/在Linux系统下查看自己的内核版本,尽量采用一致的版本,避免后续带来各种suprise。使用uname -r命令查看解压内核文件,下面是解压后的内核源码目录树使用make menuconfig配置内核配置完成后,使用ma...
2020-03-25 11:15:28
280
原创 C++实现单链表创建、插入、删除等
本文通过C++编程实现对单链表的创建、插入、删除等操作#include <iostream>#include <string>using namespace std;/* Link struct body*/typedef struct Node{ int data; struct Node *next;}LinkList;Lin...
2020-03-25 10:15:19
2645
原创 insmod加载内核模块后报错,Invalid module format
在使用insmod加载模块时报错:Invalid module format原因分析:使用dmesg | grep module 查看Ubuntu系统版本与内核版本不一致造成,接下来查看系统版本,使用uname –r查看若版本不一致,请重新下载编译内核版本。同时,可参考该Makefile文件:重新加载hello_module.ko,问题已解决!...
2020-03-07 14:20:41
17030
1
原创 ESP32 Linux开发环境配置
1.开发环境说明1.1 使用Ubuntu 16.04搭建ESP32开发环境1.2 使用ESP_IDF v3.3版本,参考官方手册“Read the Docs Template esp_idf v3.3”2.准备工作开发 ESP32 应用程序需要准备:1.PC:Linux操作系统2.工具链:用于编译 ESP32 应用程序3.ESP-IDF:包含 ESP32 API 和用于...
2020-03-05 20:57:24
1480
原创 VMware Machine Ubuntu Dual-VMnet Configuration
VMwareMachine Ubuntu Dual-VMnet Configuration 该文档配置为双网卡模式,目的是分别通过eth0使用NFS挂载ARM板进行开发,通过eth1使用Samba与Windows共享文件。首先在Windows启动命令窗口:win+R,接着键入ipconfig,查看IP地址1. Bridged(桥接模式) 桥接模式就是将主机网卡与虚拟机虚拟的网卡...
2018-04-22 22:45:25
112
原创 Ubuntu Samba Configuration
Ubuntu Samba Configuration1.Ubuntu 出现apt-get: Package has no installation candidate问题解决方法如下:# sudo apt-get update# sudo apt-get upgrade这样就可以正常使用apt-get了一.samba的安装:sudoapt-getinstall...
2018-04-22 22:37:17
900
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人