自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 IMX6ULL内核驱动

为 Linux 准备运行环境,是裸机程序,为内核(kernel)启动准备环境并引导其启动。:操作系统核心,负责等管理,还会加载根文件系统(rootfs),之后启动 init 进程。:操作系统启动后第一个挂载的文件系统,是按一定格式组织的一堆文件集合,包含配置文件、启动脚本、命令、用户程序等。。内核启动后,会加载(挂载)根文件系统,并启动。init 进程进而设置环境变量、启动相关服务、shell 及用户应用程序。图片中多次提到的/proc是一个。

2025-10-09 21:07:36 657

原创 ADC(模数转换器)与PWM(脉冲调制宽度)寄存器配置

寄存器功能描述GS状态寄存器,包含校准状态信息GC全局控制寄存器,控制 ADC 使能和校准CFG配置寄存器,设置分频系数和采样时间HC[0]通道 0 控制寄存器,控制转换触发和中断HS硬件状态寄存器,指示转换完成状态R[0]通道 0 结果寄存器,存储转换结果寄存器功能描述PWMCRPWM 控制寄存器,配置 PWM 工作模式PWMPRPWM 周期寄存器,设置 PWM 周期PWMSARPWM 采样寄存器,设置占空比PWMSRPWM 状态寄存器,包含中断标志。

2025-09-18 19:41:43 959

原创 I2C 通信、AT24C02 EEPROM及LM75温度传感器的配置

IMX6ULL 的 I2C1 对应引脚为 UART4_TX(复用为 I2C1_SCL)和 UART4_RX(复用为 I2C1_SDA),需通过 IOMUXC 寄存器配置引脚复用功能和电气属性。,主要用于短距离内低速设备间的数据交互(如传感器、EEPROM、LCD 控制器等)。当总线上的引脚输出高电平时,总线上的电平高低,由通信新中的对方决定。stop信号:在时钟线为高电平时,数据线产生一个上升沿,即通信结束。I2C 通信以 “主设备发起,从设备响应” 为核心,主要包括。,简化了硬件布线,降低了系统成本。

2025-09-18 19:07:22 784

原创 I.MX6ULL开发板上的UART

嵌入式系统中的通信指两个及以上主机(计算机、嵌入式主机、芯片等)之间的数据交互,主要分为并行通信与串行通信两类。通信类型传输方式优势劣势并行通信多个比特同时通过并行线传输传输速率高占用大量芯片资源串行通信数据拆分为单个比特,按次序在单根总线传输系统资源占用少、结构简单速率相对较低USB USART&USB POWER 模块,不建议 USB 作为电源供电,避免板子发热。

2025-09-16 20:06:38 716

原创 I.MX6ULL时钟(clock)与定时器(EPIT&GPT)

作用是将高频时钟(如 PLL 输出)分频为较低频率,适配对时钟频率要求较低的外设(如 UART、SPI),同时降低相关模块的功耗或满足外设的时序约束。作用是通过检测相位和频率差,控制低通滤波器和 VCO,使 VCO 输出频率稳定在目标值,确保 PLL 输出时钟的准确性和稳定性。作用是为芯片内部不同模块(如 CPU、外设)提供稳定且精确的高频时钟,满足各模块对时钟频率的特定需求。1.什么是 PLL、Prescaler、PFD,它们各自的作用是什么?应用:1s 定时中断,在中断服务函数中反转 LED 灯状态。

2025-09-14 20:55:55 948

原创 I.MX6ULL按键实现(轮询及中断)及工程优化

按键数量与功能:共 3 个按键(两红一黄),功能分工明确左侧(on/off):低功耗控制按钮中间(reset):系统复位按钮右侧(KEY0):用户独立控制的试验按键<本次实验主要使用KEY0>电平逻辑:开关断开时,引脚为高电平;开关按下时,引脚为低电平(关键逻辑,代码设计核心依据)

2025-09-12 21:02:13 900

原创 C 语言实现 I.MX6ULL 点灯(续上一篇)、SDK、beep及bsp工程管理

通过#define。

2025-09-11 19:57:13 1100 2

原创 keil环境下的汇编启动代码及VS Code下IMX6ULL开发板LED实现

IMX6ULL-Mini 开发板是正点原子推出的基于 NXP i.MX6ULL SOC 的嵌入式开发平台,核心特点为。注意:若烧录速率显示 “上 M”,说明烧录失败,需拔掉读卡器、重启 Ubuntu 后重新尝试。启动代码是嵌入式开发中初始化硬件、设置运行环境的基础,采用汇编语言编写。开发外设前需明确硬件连接和寄存器配置,核心参考文档(开发板购买处可提供),开发板采用 “核心板 + 底板” 的模块化设计,核心板通过。与底板连接,便于硬件扩展和维护。ifconfig命令。

2025-09-10 20:09:37 777

原创 汇编语言的基础使用及ARM 裸机开发环境搭建

问题 1:被调函数修改主调函数的寄存器,导致数据丢失问题 2:函数嵌套时,LR被覆盖,无法正确返回栈保护现场(入栈保存寄存器,出栈恢复)

2025-09-08 20:02:10 1042

原创 ARM 体系结构

​未定义模式(Undef)0x00000008​。

2025-09-07 21:11:36 1378

原创 硬件:传感器(DS18B20)

它具有体积小、硬件开销低、抗干扰能力强、精度高的特点,可直接将温度转化为数字信号,便于与单片机等微控制器进行接口连接,广泛应用于各种温度检测场合,如工业控制、消费电子、医疗设备等领域的温度监测。发送温度转换指令后,等待转换完成(转换时间与精度有关,12 位精度时约为 750ms),然后发送读取温度指令,读取到的数字温度值需要进行相应的转换,得到实际的温度值(单位为摄氏度)。实现单片机对 DS18B20 的初始化操作,按照单总线初始化的时序,控制 I/O 口的电平变化,检测 DS18B20 的响应。

2025-09-07 19:54:48 1271

原创 硬件:UART

UART概念UART:通用异步收发器,2个串口(1个串口被用于ISP下载程序,1个串口被用于和主机之间的通信) , RXD(接收信号线),TXD(发送信号线),全双工,串行,异步一、通信方式1.单工(1)发送方和接收方是固定的,数据只能从发送方发给接收方(2)数据传输是通过一根信号线实现,数据传输的方向是固定的2.半双工 (I2C)(1)通信双方既可以作为发送方也可以作为接收方(2)数据传输是通过一根信号线实现,数据传输的方向可以是双向的。

2025-09-04 19:26:39 806

原创 硬件:51单片机的按键、中断、定时器、PWM及蜂鸣器

当按键被按下时,P1_4 引脚与 GND 短路,呈现低电平;GPIO(General Purpose Input/Output)是 51 单片机与外部设备交互的最基础接口,通过引脚的电平变化实现数据的输入和输出。即当 P1 端口与 0x10(二进制 00010000)进行与运算结果为 0 时,说明 P1_4 为低电平,按键被按下。定时器是产生精准定时的模块,51 单片机内部有两个定时器(timer0、timer1),均为 16 位自增型计数器。判断按键是否被按下,只需检测对应引脚是否为低电平。

2025-09-03 18:54:37 692 2

原创 硬件:51单片机

Atmel(AT89C51)、Philip(P89V51系列单片机,增强型单片机ISP在线编程)、STC宏晶半导体(STC89C51、STC89C52、STC89C52RC)涉及编程语言(C/C++)、操作系统(Linux,具备文件、多任务、网络等功能)、数据结构、数据库。ROM:Read-Only Memory,只读存储器, 存放单片机程序、指令、掉电数据不丢失。外存:主要存放程序、代码、指令,掉电数据不丢失,读写速度慢,价格便宜(移动硬盘)CPU、RAM、ROM、Timer、PWM、IO、中断。

2025-09-02 18:37:23 1080 2

原创 Linux 网络:数据库

回调函数功能:SQLite3 查询到每一行数据时,自动调用该函数,传递 “字段名” 和 “字段值”。结尾,大小写不敏感(建议关键字大写,表 / 字段名小写)。:按条件删除部分记录(无条件会删除所有记录):删除整个表(含所有数据,谨慎使用)(有结果集,需回调函数)。:添加字段、重命名表等。.schema 表名。

2025-09-02 18:22:41 752

原创 linux 网络:并发服务器及IO多路复用

一、服务器模型:从单客户端到多客户端1. 核心概念与基础流程二、单循环服务器(迭代服务器)1. 实现代码2. 核心特点三、并发服务器:多进程与多线程模型1. 核心思想2. 多进程并发服务器(1)实现代码(2)关键细节(3)优缺点3. 多线程并发服务器(1)实现代码(2)关键细节(3)优缺点四、IO 模型:阻塞与非阻塞1. 阻塞 IO 模型(默认)2. 非阻塞 IO 模型五、IO 多路复用(高并发)1. 核心思想2. select函数(基础 IO 多路复用)

2025-08-28 20:38:55 954

原创 linux 网络:协议及Wireshark抓包工具的使用

【代码】linux 网络:协议及Wireshark抓包工具的使用。

2025-08-28 20:23:49 1057

原创 Linux 网络 :TCP粘包及UDP

【代码】linu 网络 :TCP粘包及UDP。

2025-08-28 20:02:41 661

原创 Linux:网络

网络的核心是实现不同主机的进程间通信步骤服务器端(被动方)客户端(主动方)核心差异初始化socket()创建监听套接字socket()创建客户端套接字服务器需后续绑定和监听地址关联bind()绑定 IP 和端口无需绑定(系统自动分配)服务器必须固定地址,客户端灵活连接处理listen()监听 +accept()接受connect()发起连接服务器被动等待,客户端主动发起通信套接字accept()返回的新套接字(conn_fd创建时的套接字(client_fd服务器用新套接字单独通信。

2025-08-21 18:46:50 1170

原创 Linux软件编程:进程间通信(2)——IPC

一、消息队列1.IPC对象2.IPC对象操作命令1.查看IPC对象2.删除IPC对象3.操作流程4.函数接口1.ftok2.msgget3.msgsnd4.msgrcv5.msgctl二、共享内存1. 概念2. 操作方法3.函数接口1. ftok(同消息队列)2. shmget3. shmat4. shmdt5. shmctl三、信号灯1. 概念2. 信号灯操作3. 函数接口1. ftok(同消息队列)2. semget3. semop。

2025-08-19 19:37:38 925

原创 Linux软件编程:进程间通信(1)

进程是操作系统资源分配的最小单元,每个进程的用户空间(文本段、数据段、系统数据段)相互独立,无共享空间。因此,多个进程需借助 Linux 内核实现数据传递或事件通知,这一过程称为进程间通信(IPC)信号是 Linux 系统中用于实现应用层与内核层、进程间事件通知的机制,支持异步通信;多个进程没有共享的用户空间,进程是操作系统资源分配的最小单元。管道是一种基于内核缓冲区的通信机制,分为无名管道和有名管道两种。进程空间是独立的,包含文本段、数据段和系统数据段。系统中的信号主要实现应用层和内核层之间的信号通知。

2025-08-18 18:30:12 652

原创 Linux软件编程:线程间通信

同一进程的线程共享全局变量、静态变量、堆区数据(malloc 分配),但局部变量(栈区)不共享;多线程因加锁 / 解锁顺序错误,导致线程相互等待对方释放锁资源,程序无法继续执行的状态。线程间通信指多个线程之间传递信息的过程,是多线程协作完成任务的核心机制。一个进程中的多个线程独享栈空间,文本段、数据段、堆区进程多线程共享。,申请资源会阻塞等待,直到占用资源的任务释放资源,资源数不为。,则会阻塞等待,直到有任务释放资源,才能拿到资源并继续向下。只能防止多个线程对资源的竞争,不能决定代码的先后执行顺序。

2025-08-16 21:38:37 837

原创 Linux软件编程:线程

一、基本概念二、线程与进程的区别1.空间管理2.进程和线程区别三、多线程与多进程的优缺点对比四、线程的调度与消亡五、线程相关函数接口。

2025-08-15 17:43:01 660

原创 Linux软件编程:进程

一、基本概念二、进程创建1. 进程空间分布2. 虚拟地址与物理地址3. 多进程存储与调度三、进程相关命令1. top2. ps -ef3. ps -aux4. 后台执行进程任务5. jobs6. fg四、进程状态五、进程相关函数接口1.fork:创建子进程3.exit与_exit4.进程回收1.wait2.waitpid六、进程消亡1.孤儿进程2.僵尸进程:3.如何避免产生僵尸进程?

2025-08-14 18:50:56 945

原创 Linux 软件编程:文件IO、目录IO、时间函数

打开目录文件 → 读取目录项 → 关闭目录文件。

2025-08-13 21:00:09 618

原创 Linux 软件编程:IO——标准IO

【代码】Linux 软件编程:IO——标准IO。

2025-08-11 21:24:16 865

原创 数据结构基础:哈希表、排序和查找算法

首先取出要插入的元素,然后依次和前面的元素比较,比该元素大的元素向后移动,直到遇到前一个元素比要插入的元素小,或者到达有序数列的开头时停止,最后将该元素插入到合适位置。核心思想是选择数组左边的元素作为键值,从数组后面找一个比键值小的元素放到前面,再从前面找一个比键值大的元素放到后面,最后将键值放到中间位置。核心思想是通过相邻元素的比较和交换,使较大的元素逐步 “浮” 到数组的末尾。具体来说,相邻的两个元素比较,大的向后走,小的向前走,循环找出数组中 len-1 个较大的值,最终实现整个数组的有序排列。

2025-08-08 18:36:17 1028

原创 数据结构基础:二叉树

树形结构中的所有节点度数最大为2,这样的树形结构被称为二叉树通过函数递归完成完全二叉树的创建申请节点空间存放数据编号如果存在左子树递归创建左子树如果存在右子树递归创建右子树。

2025-08-07 18:24:21 1061

原创 数据结构基础:栈和队列

分类:包括增栈(栈的方向自低向高增长)、减栈(栈的方向自高向低增长);空栈(栈针指向要入栈的位置)、满栈(栈针指向栈顶元素的位置),常见的有空增栈、空减栈、满增栈、满减栈 栈的创建 销毁栈 判断栈是否为空 判断栈是否为满 压栈 出栈链式栈及操作使用链表思想实现,参考单向链表节点定义,压栈参考单向链表头插法,出栈返回链表第一个有效节点的值并删除该节点,销毁栈参考单向链表销毁。基于内核链表实现的链式栈:需使用前面章节

2025-08-06 21:02:45 209

原创 数据结构基础:链表(2)——双向链表、循环链表、内核链表

初始化空白头结点,使头节点的next和prev都指向自身。头插法,将新节点插入到链表头部。尾插法,将新节点插入到链表尾部。按指定顺序插入,根据比较函数指定的顺序插入节点。将节点移出所属的链表,移除节点并做特殊标记。将节点移出所属的链表并初始化,移除节点后将其初始化为指向自身。将节点移动到另一个链表的头部。将节点移动到另一个链表的尾部。判断链表是否为空,若头节点的next指向自身则为空。链表拼接相关等,用于将一个链表的元素拼接到另一个链表的前面或后面。判断节点位置。

2025-08-05 20:09:36 934

原创 数据结构基础:链表——单向链表

从本篇开始将记录一些数据结构的学习,C语言阶段已经结束,本文主要认识了链表的相关概念和一些相关操作,以及工程管理工具makefile,便于工程项目的创建,建议使用VS Code来进行程序编写。

2025-08-02 21:06:23 927

原创 Linux C: 内存管理

C 语言内存管理需程序员手动控制堆区空间的申请与释放,是避免内存泄露、野指针的核心知识点。不能释放非堆区空间(如栈区局部变量的地址)。不能重复释放(同一空间释放多次会崩溃);变为野指针,建议置为 NULL(

2025-07-30 18:44:23 412

原创 Linux C:位运算符

位运算符直接操作数据的二进制位,适用于底层硬件操作、数据压缩、状态控制等场景,效率极高。异或:可以实现不使用第三方变量完成两个数的交换。移位运算符优先级高于其余位运算符。左移:让数据变大,等价于。右移:让数据缩小,等价于。

2025-07-30 18:37:02 442

原创 Linux C:构造数据类型

定义:存储类型 + 结构体类型 + 变量名。

2025-07-29 18:50:47 651

原创 Linux C : 指针

基本格式存储类型 数据类型 *变量名;int *p;// 定义int型指针变量pchar *str;// 定义char型指针变量str// 定义float型指针变量f_ptr// 同时定义多个int型指针变量(每个变量前都需加*)```

2025-07-25 21:01:12 1784

原创 Linux C:预处理命令

define K (在程序中间进行定义) //说明在所定义行以后出现K。#include <1.txt> //自动去 usr/include///替换数值后会造成语法错误。#include "1.txt" //当前所在文件的路径。为了区分宏名和所定义的普通变量,规定定义的宏名所有字母大写。//带参宏的形参列表当中的每一个参数不需要指定数据类型。#define 宏名(参数表)宏的内容。4)调用函数的文件只需加对应函数的。在编译程序时所做的一系列过程。

2025-07-24 18:52:41 504

原创 Linux C: 函数

本篇进入了函数的部分,也是C语言进阶阶段的第二个重难点,本文主要从函数的定义、声明、调用三个方面来认识和学习函数的使用,并学习了计算机的底层原理的实现、局部变量、全局变量、变量的生存期来更好的理解代码的存储,函数的递归调用举例了汉诺塔游戏来加以证明,希望大家有更好的理解,还有少部分内容(数组作为参数传递等问题)没有记录上,明天会在文后加以补充。(3)C程序的执行是从main函数开始的,如是在main函数中调用其他函数,在调用后流程返回到 main函数,在main 函数中结束整个程序的运行。

2025-07-23 20:38:29 1469

原创 Linux C:二维数组

/按序初始化,此时a[2][3] = 0。//可将二维数组a[3][4]理解成二维数组有三个数据,每行装了长度为四的一维数组,因此,a[0]不能被直接赋值/引用,(原因:a[0]为一维数组的数组名)int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};a[0] = 100;2.冒泡排序及二分查找。

2025-05-21 18:35:50 348

原创 Linux C:字符数组

strlen : 数组中存储的有效容量(若已知字符串需要存储但不知字符串长度,需要定义长度至少为strlen + 1的数组来存储该字符串,若不及该长度则会引起数组的越界访问)scanf("%s" , s);//s此时已经为数组s首个元素地址,不用&(不收录\n,不检测越界)该函数为两字符串对应字符两两比较,若相同为字符相同,则应向后位依次进行比较。可以将s理解为容器,而该容器的容积为100,初始化值应该小于s的容积。‘\0’ :字符串的结束标志,空字符,1个字节,ASCII码值为0。

2025-05-19 16:32:45 847

原创 linux C :一维数组

但a[-1]a[15]等类似元素内容并非定义的数组a[10]中的实际访问内容,因此将会改动其他地址所存的内容,在计算机运行过程中一旦造成越界访问将造成不可预估的后果!将a数组当中的元素逐个向b数组当中进行插入操作 ,每插入一个元素,要让 b数组当中的已插入元素成为一种有序序列,最终b数组中即为数组a中有序排列的复制品.int b[len];//此时b中为随机数。定义a[10],元素编号为a[0] a[1]......a[8] a[9]待排数组a[ ],创建数组b[ ],要求b数组长度大于等于a数组,即。

2025-05-13 23:08:58 1785

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除