互斥:同一时刻,共享资源只能被一个任务所使用。 同步:控制不同任务访问共享资源的顺序。 其实,就可以把通知理解为同步,它们的作用都是控制任务的执行顺序。 任务之间的通信,称为 IPC(Inner-Process Communication) FreeRTOS中提供了队列、信号量、事件组、任务通知用于
断言机制 断言:条件为假,执行代码(通常让程序停止执行)。 FreeRTOS 默认的断言: #define configASSERT(x) if (!x) while(1); 改进的断言: #define configASSERT(x) if(!x) { printf("%s %s %d\r\n"
使能软件定时器功能: 添加 timer.c 和 timer.h 文件 添加配置 #define configUSE_TIMERS 1 创建定时器 // 动态创建定时器 TimerHandle_t xTimerCreate(const char * const pcTimerName,
中断配置 FreeRTOS 屏蔽的是 NVIC 配置的中断优先级,而不是芯片中固定的中断号。 使用 FreeRTOS 的时候,单片机优先级组通常必须设置为 NVIC_PriorityGroup_4,以适应 FreeRTOS,因为 FreeRTOS 只关注抢占优先级。 对于 Cortex-M,数字越小
FreeRTOS中叫任务,RT-Thread中叫线程,一个东西。 FreeRTOS 是抢占式调度系统,高优先级任务一旦就绪(如被信号量唤醒、延迟到期等),会立即抢占 CPU。 任务状态 四种任务状态:运行态、就绪态、阻塞态和挂起态 运行态:任务得到了CPU的使用权,正在执行中。单核处理器的同一时刻,
从官方示例中得到的配置文件,是不能直接使用的,需要修改,以符合单片机硬件。 FreeRTOS 支持: 时间片调度:任务按时间片执行,时间片通常为1ms。 抢占式调度:高优先级任务抢占低优先级,高优先级任务需让出内存。 抢占式+时间片调度 默认只开启抢占式调度。 系统相关配置
启动进程 system 用于在代码中执行 shell 命令。 #include <stdlib.h> int system(const char *command); 类型:库函数 线程安全:是 参数: 返回值: 成功: 失败:-1 并设置 errno
errno 很多函数失败返回-1 并设置 errno,errno是啥 errno = “最近一次系统调用失败的原因编号(整数)” 每个线程私有。 这个编号只有在出错的时候才会更新,平时读的都是上一次的。 查询errno: man 3 errno errno -l 使用方法1:只打印编号 int fd
RGB888 RGB565 RGB555 RGB888转RGB565 LCD 驱动程序提供两个参数,只需要关心这个可变参数就行了。 应用编程 </
I2C 和 SPI 很相似,放在一起讲。 I2C 和 SPI 都是 SOC 上的外设,厂商已经实现好了主机控制器驱动,所以无论换什么芯片,驱动的写法都是一样的。 总线架构 I2C 功能架构: S
GPIO 和 Pinctrl 子系统是为了更方便的初始化和使用引脚。 GPIO 子系统提供操作引脚的函数。 Pinctrl 子系统用于设置引脚复用和电气属性。 pinctrl 子系统 参考文档: pinctrl 子系统源码目录为 drivers/pinctrl 内核\Documentation\de
proc 是伪文件系统,不在磁盘中,只存在于内存中。 挂载在 /proc 目录下,内核运行时动态生成里面的内容,为用户空间程序提供了一个动态查看和修改内核运行时信息的窗口。 如何使用 proc 手动浏览:使用 ls和 cat是最直接的方式。 编程读取:应用程序可以像打开普通文件一样 open()、r
好的,我们来深入讲解 sysfs 文件系统。它与 proc文件系统密切相关,但在设计目的和使用方式上有显著区别。 简单来说,sysfs是一个基于内存的虚拟文件系统,它在用户空间和内核空间之间提供了一个结构化的、清晰的接口,主要用于导出内核设备模型的各个部分——即系统中的总线、设备、驱动以及它们的相互
设备和驱动匹配方式: 设备树匹配(现代使用) id 匹配(老,淘汰) name 匹配(远古,淘汰) ACPI 匹配(x86 使用) 匹配优先级:设备树匹配 > id 匹配 > name 匹配 Linux 设备驱动模型 驱动和设备写在一起的缺点: 设
设备树简介 早期 Linux 内核源码包含大量的与特定硬件平台相关的代码,代码重复度高且杂乱无章,内核维护工作量大。 后来引入设备树,这是一个描述硬件信息的数据结构,将硬件配置从 Linux 内核源码中提取出来,提高了移植性,更方便维护。 小故事:Linux 之父 Linus Torvalds 闲来
设备文件位于 /dev 下。 设备文件和普通文件的区别: 设备号 设备号共 32 位: 主设备号:占高12位,标识一个类型的设备,全局唯一。 次设备号:占低20位,标识一个类型下的不同设备,每个主设备号下的次设备号互不干扰,不会冲突。 // 拼接成设备号 dev_t devno = MKDEV(
Linux 是单内核操作系统,所有的内核功能被整体编译在一起,形成一个单独的内核镜像文件。 优点是执行效率非常高,缺点是要增加、删除、修改内核的某个功能,需要重新编译和重启整个系统。 后来 Linux 引入内核模块来弥补这一缺点。 内核模块是单独编译的一段代码,在 Linux 运行时可动态的加载和卸
学习驱动必知: 学习驱动的目的不是为了开发驱动,而是能看懂并移植驱动,使硬件能正常工作。 现在很少有机会自己从零开始实现一个复杂的驱动。 现在驱动的需求很少了,不可能单独作为一个岗位的,都是搞 Linux 应用开发的顺带的工作,想找驱动的工作就是在做梦。 新人基本上是搞不了驱动的,投简历也是没人搭理
内核配置 (1)需要先设置CPU的架构,和交叉编译工具: 在顶层 Makefile 文件,将: ARCH ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) 改为: ARCH ?= arm CROSS_COMPILE ?= a
开发板:TL3506-MiniEVM_S(256MB DDR+256MB NAND FLASH) ¥299 SDK 位置:\4-软件资料\Linux\LinuxSDK\LinuxSDK-v1.2.tar.gz 内核:\4-软件资料\Linux\Kernel\src\linux-6.1.99-v1.2