- 博客(25)
- 收藏
- 关注
原创 嵌入式Linux——7输入设备
输入系统。驱动开发人员基于这套框架开发出程序,应用开发人员就可以 使用统一的 API 去使用设备。输入系统框架:APP 发起读操作,若无数据则休眠;用户操作设备,硬件上产生中断;读取到数据,转换为标准的输入事件,向核心层汇报。所谓输入事件就是一个“struct input_event”结构体。有多种 handler,比如:evdev_handler、kbd_handler、joydev_handler 等等。
2025-03-24 19:30:13
830
原创 嵌入式Linux——6文字显示 、freetype
Freetype 是开源的字体引擎库,它提供统一的接口来访问多种字体格式文件, 从而实现矢量字体显示。我们只需要移植这个字体引擎,调用对应的 API 接口, 提供字体文件,就可以让 freetype 库帮我们取出关键点、实现闭合曲线,填充 颜色,达到显示矢量字体的目的。关 键 点 (glyph) 存在字体文件中 , Windows 使用的字体文件在 c:\Windows\Fonts 目录下,扩展名为 TTF 的都是矢量字库,本次实验使用的是新宋字体 simsun.ttc。
2025-03-22 12:03:24
1023
原创 嵌入式Linux——Framebuffer应用编程
在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCDFramebuffer中保存着一帧图像的每一个像素颜色值,假设LCD的分辨率是1024x768,每一个像素的颜色用32位来表示,那么Framebuffer的大小就是:1024x768x32/8=3145728字节假设需要设置 LCD 中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的 BPP 值设置颜色。假设 fb_base 是 APP 执行 mmap 映射得到的 Framebuffer 地址,如下图。
2025-03-21 21:06:00
588
原创 嵌入式Linux——gcc和Makefile
所有的#include被替换为对应的头文件内容。所有的宏(#define)被展开。条件编译(如#ifdef)被处理。注释被删除。将预处理后的源代码转换为汇编代码,生成一个汇编代码文件(.s文件)将汇编代码转换为机器代码(二进制文件),生成一个目标文件(.o文件)将多个目标文件和库文件合并,生成最终的可执行文件:所有的目标文件被合并。符号引用(如printf函数)被解析并链接到标准库或其他库。生成的文件可以直接运行。
2025-03-18 19:09:50
554
原创 lwIP——4 网络接口
网络层数据传输lwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接和硬件平台打交道,硬件不同则处理也是不同的,所以由用户提供最底层的接口函数,lwIP提供统一的接口,但是底层的实现需要用户自己去完成(ethernetif.c)在lwIP中每一个网卡都由一个netif 结构体来表示,这些结构体描述了各个网卡的底层实现函数及状态,并以链表形式链接起来linkoutput。
2025-01-26 00:38:01
930
原创 lwIP——3 内存管理
申请一个大数组,完成后返回内存地址传入内存地址让算法进行释放lwIP内存堆和内存池应用:MAC内核的数据(内存堆和内存池可适用)用户调用 lwIP 的 API 发起数据发送操作,需要存储要发送的数据以及相关的控制信息(lwIP一般选用内存堆申请内存)用户可主动调用lwIP的内存池和内存堆API接口申请内存netconn、socket、raw接口,这些接口控制块通常具有固定的结构和大小(lwIP一般选用内存池申请内存)API消息、数据包消息,其大小通常相对固定或者在一定范围内。
2025-01-23 23:10:39
809
原创 lwIP——以太网DMA描述符
还是要注意:老版本是申请一个缓存区,将pbuf缓存区的数据拷贝进去,再进行传输新版本不用申请缓存区,直接操作pbuf。
2025-01-20 23:35:32
771
原创 STM32补充——IAP
①跳转到复位中断服务函数②跳转到main函数③发生中断时,会强制跳转到中断向量表④根据中断源,跳转到对应的中断服务函数⑤执行中断服务程序后,回到main函数原来的位置执行。
2025-01-19 21:38:38
2285
原创 STM32补充——FLASH
驱动函数关联寄存器功能描述(…)FLASH_KEYR用于解锁FLASH_CR的访问(…)FLASH_CR用于锁定FLASH_CR的访问(…)FLASH_CR用于FLASH的写入(…)用于大量擦除或擦除指定的闪存扇区(…)FLASH_SR等待操作完成FLASH相关结构体:FLASH_EraseInitTypeDefF1:se/*擦除类型*/
2025-01-19 18:17:08
2131
原创 FreeRTOS笔记 ——20 内存管理
动态方法创建自动地从 FreeRTOS 管理的内存堆中申请创建对象所需的内存,并且在对象删除后, 可将这块内存释放回FreeRTOS管理的内存堆静态方法创建:需用户提供各种内存空间,并且使用静态方式占用的内存空间一般固定下来了,即使任务、队列等被删除后,这些被占用的内存空间一般没有其他用途动态方式管理内存相比与静态方式,更加灵活。为什么不用标准的 C 库自带的内存管理算法 malloc( ) 和 free( )?占用大量的代码空间 不适合用在资源紧缺的嵌入式系统中没有线程安全的相关机制。
2025-01-05 20:16:33
682
原创 FreeRTOS笔记——19Tickless低功耗模式
configPOST_SLEEP_PROCESSING(x):此宏用于定义需要在系统退出低功耗模式后执行的事务,如:退出低功耗后开启之前关闭的外设时钟,以使系统能够正常运行。configPRE_SLEEP_PROCESSING(x):此宏用于定义需要在系统进入低功耗模式前执行的事务,如:进入低功耗前关闭外设时钟,以达到降低功耗的目的。:将在原先二值信号量的课堂源码中,加入低功耗模式,最后对比这个两个实验的功耗结果,观察Tickless 模式对于降低功耗是否有用。,让MCU 进入相应的低功耗模式;
2025-01-05 15:34:27
775
原创 FreeRTOS笔记——18软件定时器
芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。(硬件定时器数量有限)是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息。软件定时器的优缺点:1.硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个;2.使用简单、成本低软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。
2025-01-04 21:12:52
842
原创 FreeRTOS笔记——17任务通知
任务通知方式eNoAction = 0, /* 无操作 */eSetBits /* 更新指定bit 类似事件标志组*/eIncrement /* 通知值加一 类似计数型信号量*/eSetValueWithOverwrite /* 覆写的方式更新通知值 类似给队列发送消息*/eSetValueWithoutOverwrite /* 不覆写通知值 */任务通知状态。
2024-12-18 15:25:19
843
原创 FreeRTOS笔记——16事件标志组
更多事件标志组相关的API函数介绍请查阅《FreeRTOS开发指南》-- 第十六章“FreeRTOS事件标志组”
2024-12-18 01:19:10
574
原创 FreeRTOS笔记——15队列集
启用队列集功能需要将宏configUSE_QUEUE_SETS 配置为 1创建队列集创建队列或信号量往队列集中添加队列或信号量往队列发送信息或释放信号量获取队列集的消息。
2024-12-17 12:14:31
960
原创 FreeRTOS笔记——14信号量
信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问当计数值大于0,代表有信号量资源;当释放信号量,信号量计数值(资源数)加1;当获取信号量,信号量计数值(资源数)减1;(信号量的计数值都有限制:限定最大值。如果最大值被限定为1,那么它就是二值信号量;如果最大值不是1,它就是计数型信号量。
2024-12-17 11:43:54
735
原创 FreeRTOS笔记——12时间管理
相对延时:vTaskDelay()绝对延时:xTaskDelayUntil():指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务(延时时间就是任务的运行时间)
2024-12-14 00:08:19
370
原创 FreeRTOS笔记——11任务状态查询API函数
获取任务优先级:uxTaskPriorityGet()设置任务优先级:vTaskPrioritySet()获取系统中任务的数量:uxTaskGetNumberOfTasks()获取所有任务状态信息:uxTaskGetSystemState()获取指定单个的任务信息:vTaskGetInfo()获取当前任务的任务句柄:xTaskGetCurrentTaskHandle()根据任务名获取该任务的任务句柄:xTaskGetHandle()
2024-12-13 20:50:59
774
原创 FreeRTOS笔记——08列表和列表项
FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS中的任务。:存放在列表中的项目(列表的子集)(列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向环形链表)不同于数组,数组成员地址是连续的,数组在最初确定了成员数量后期无法改变在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构的地址迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项。
2024-12-09 00:24:27
950
原创 FreeRTOS笔记——07临界区代码保护及任务调度器挂起和恢复
只有当uxSchedulerSuspended==pdFALSE时才会进入该if语句修改xTaskIncrementTick() 的返回值(uxSchedulerSuspended初始值就是pdFALSE)才会执行 portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT 开始任务调度(这个函数就是开启任务调度的意思)把之前取出的中断屏蔽值重新写入basepri中,实现开中断(或者说恢复原来的中断)临界段:也叫做临界区,是指那些必须完整运行,不能被打断的代码段。
2024-12-07 22:04:42
908
原创 FreeRTOS笔记——06中断管理(开关中断)
使用两个定时器,一个优先级为4,一个优先级为6,注意:系统所管理的优先级范围:5~15, 现象:两个定时器每1s,打印一段字符串,当关中断时,停止打印,开中断时持续打印。PendSV和Systick中断优先级分别从优先级15(操作是15左移4位,因为寄存器只有高四位用于配置中断优先级)左移(向高位移)16和24位(具体操作如下图)5左移4位(中断优先级配置寄存器只有高4位可以配置中断优先级)赋值给BASEPRI,中断优先级在 5 ~ 15 的全部被关闭。SHPR3 寄存器地址:0xE000ED20(4位)
2024-12-07 19:09:24
520
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人