Linux并发与竞争 原子操作 原子操作能够在无锁条件下实现线程安全操作,避免多个线程同时修改变量导致数据竞争。比较适用于简单的计数或标志变量等小型共享数据。但是原子操作只能保证单个原子变量的原子性,不能保护复杂数据结构。并且虽然其不会导致线程阻塞,但可能导致活锁,即多个线程不断重试并竞争CPU资源。 驱动中通过原子操作来保护进程的方式为: 在设备结构体中声明原子变量 1234struct gpioled_dev 2025-03-24 嵌入式(Linux开发)
Linux字符设备驱动框架 字符设备 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。 字符设备驱动工作流程 加载/卸载驱动模块 Linux的驱动有两种工作方式: 驱动编译进kernel,kernel启动时自动运行驱动程序 驱动编译为模块( 2025-03-14 嵌入式(Linux开发)
IMX6ULL Linux内核移植 准备工作 网络设置 关闭主机的Ubuntu的防火墙: 1sudo ufw disable 确认VMWare使用桥接模式,主机、虚拟机和开发板三者处于同一网段,如: 主机:192.168.1.100 虚拟机:192.168.1.105 开发板:192.168.1.103 (DHCP获取) 在uboot下,开发板ping虚拟机和主机、虚拟机ping主机应当都能ping通。未加载Linux内核前 2025-03-11 嵌入式(Linux开发)
NXP 官方u-boot移植和启动过程 官方U-Boot下载 Github 下载后拷贝tar.bz2至Linux,然后tar -vxjf U-boot工程目录 除了文件夹之外,还有一些文件: 验证defconfig cd /configs/,确认存在有I.MX6ULL的配置文件: 新版本uboot中mx6ull_14x14_evk_defconfig用于传统的非安全启动(Non-Secure Boot)模式,而mx6ull_ 2025-03-07 嵌入式(Linux开发)
IMX6UL DDR3配置 RAM和ROM RAM:Random-access memory,随机存储器,随时读写,速度快,掉电后数据丢失。内存条即为常见的RAM。ARM中栈、堆(malloc申请的内存)、全局区(.bss段、.data段)都存放在RAM中。 ROM:Read-only memory,只读存储器。容量大,速度慢,掉电后数据留存。 对于IMX6U,256/512MB的DDR3为RAM,512MB的NANF 2025-03-05 嵌入式(Linux开发)
IMX6ULL外部中断配置 Cortex-A7中断系统 中断向量表 Cortex-A7的中断向量表共有8个异常中断,其中一个未使用,有效中断为7个: 向量地址 中断类型 中断模式 0X00 复位中断(Rest) 特权模式(SVC) 0X04 未定义指令中断(Undefined Instruction) 未定义指令中止模式(Undef) 0X08 软中断(Software Interrupt,SWI) 2025-03-04 嵌入式(Linux开发)
I.MX6ULL 时钟配置 时钟来源和生成 包括以下三个时钟来源: 外部晶振,高速晶振频率24Mhz,低速晶振频率32.768KHz 低压差分信号 (LVDS) I/O 端口,用于从外部获取时钟信号 锁相环(PLL),主时钟包含七个 PLL。其中两个 PLL 分别配备四个相位小数分频器 (PFD),以生成额外的频率。 七个PLL包括: PLL1(ARM_PLL),ARM内核时钟,最高可倍频至1.3GHz(但MCU最 2025-03-03
Linux下规范性Makefile规则 文件目录 bsp clk (时钟驱动) bsp_clk.c bsp_clk.h delay (延时驱动) bsp_delay.c bsp_delay.h led (LED驱动) bsp_led.c bsp_led.h imx6ul cc.h (变量类型声明) fsl_common.h (NXP官方SDK通用宏定义文档) fsl_iomuxc.h (NXP 2025-03-02 嵌入式(Linux开发)
LVGL发生各种卡死现象的原因分析和排故 前言 LVGL是一个在使用时非常容易产生卡死故障的GUI库,大多数卡死都发生在动态阶段,包括且不仅限于: 启动并初始化第一个页面时 在多个页面间来回切换 触发组件回调时(例如button或timer) 长时间运行后 本文所提供的解决方案就是我自己摸索出来的,不一定适用于所有人,也不一定是最标准的办法。网上关于LVGL的教程很多,包括官方文档,但是很多方法都是不怎么规范的。官方的Github 2025-02-20 嵌入式(裸机开发)
C++类构造函数初始化列表 使用初始化列表的构造函数显式的初始化类的成员: 12345678class example{public: int a; float b; example(): a(0), b(8.8) {}} 没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化: 1234567891011class example{pub 2025-02-18 C++