- 博客(58)
- 收藏
- 关注
原创 Linux——字符设备驱动控制LED
1、将驱动编译进Linux内核中,也就是zImage,当内核启动的说话就会自动运行驱动程序;2、将驱动编译成模块(Linux下模块扩展名为.ko),在Linux内核启动以后要用insmod命令加载驱动模块,用rmmod命令卸载驱动模块。
2024-12-24 22:33:14
1184
22
原创 Linux——rootfs根文件系统构建
根文件系统也叫做rootfsFATFS这类的文件系统属于Linux内核的一部分,属于软件代码,所以ROOTFS不等于FATFS。Linux的根文件系统实际上是一个文件夹或者叫目录,这个目录下会有许多子目录,这些目录中存放许多Linux运行所必须的文件,比如库、常用的软件和命令、设备文件、配置文件等等例如我们装一个Windows系统,C盘中回存放系统正常运行所需要的文件,这个C盘就相当于我们的根文件系统。
2024-12-11 21:53:54
1584
14
原创 Linux——linux系统移植
找到drivers/net/ethernet/freescale/fec_main.c的fec_reset_phy函数,在函数最后加一行200ms的延时。最终编译出zImage和imx6ull-14x14-evk-emmc.dtb,imx6ull-14x14-evk.dtb。在Uboot命令行中通过tftp将zImage和imx6ull-14x14-evk-emmc.dtb拷贝到DRAM中。2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。
2024-12-10 17:38:05
932
2
原创 Linux——Uboot命令使用
1)Uboot是一个裸机程序,比较复杂。类似我们PC机的BIOS程序。2)Uboot就是一个bootloader,作用就是用于启动Linux或者其他系统,Uboot最主要的工作是初始化DDR,因为Linux的运行是运行在DDR里面的。(Linux镜像编译出来如果不做裁剪的话有四五兆字节那么大,一般芯片内部ram没有那么大,无法运行,必须放到DDR中运行),所以如果要运行Linux,就要先初始化好DDR,才能在DDR中运行Linux系统。
2024-11-25 22:51:09
1935
33
原创 Linux——Uboot使用NFS出现Loading: T T T T T T T T /Loading: *** ERROR: File lookup fail
出现标题情况的可能原因是Ubuntu的nfs版本太高,而Uboot使用的nfs版本比较低,不兼容造成。再检查下现在是否支持nfs V2。稳妥一定再重启一下Ubuntu。查看Linux内核版本。查看已安装的内核版本。
2024-11-25 16:05:26
380
7
原创 Linux——I.MX6U主频和时钟配置
设置 CBCMR 寄存器的 PRE_PERIPH_CLK_SEL位,设置 CBCDR 寄存器的 PERIPH_CLK_SEL位 0。因为 PERCLK_CLK_ROOT和IPG_CLK_ROOT 要用到 AHB_CLK_ROOT,所以我们要初始 AHB_CLK_ROOT。pll1_sw_clk有两路可以选择,分别为pll1_main_clk,和 step_clk,通过。AHB_CLK_ROOT、PERCLK_CLK_ROOT 以及IPG_CLK_ROOT。(4)设置 step_clk。
2024-11-18 13:50:39
899
5
原创 Linux——GPIO输入输出裸机实验
在程序启动时,BSS段会被清零,并且其大小会被计算到程序的总内存占用中,尽管它在磁盘上的表示可能非常小或甚至没有。在程序启动时,BSS段会被清零,并且其大小会被计算到程序的总内存占用中,尽管它在磁盘上的表示可能非常小或甚至没有。上面的操作是我们通过传递参数,将对应模式的值放到我们的寄存器地址。.为定位计数器,默认定位计数器为0,给这个特殊符号赋值0x87800000,后面的链接起始地址就会是0x87800000。通过结构体指针操作寄存器组,进而配置GPIO为输入还是输出模式,1为输出模式。
2024-11-15 00:40:04
1117
36
原创 Linux——ARM汇编基础
GNU汇编语法GNU汇编语法适用于所有的架构,并不是ARM独享的,GNU汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意label后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。即指令,也就是汇编指令或伪指令。符号,表示后面的是注释,就跟C语言里面的“/*”和“*/”一样,其实在GNU汇编文件中我们也可以使用“
2024-11-09 22:45:27
1115
35
原创 Linux——Ubuntu环境C编程
模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%” 表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的 文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。下面的规则的目标是main,main.o、input.o和calcu.o是生成main的依赖文件,如果要更新目标main,就必须要先更新它的所有依赖文件,如果依赖文件中的如何一个有更新,那么目标文件也必须更新,“更新”就是执行一遍格则中的命令列表。
2024-11-03 15:48:18
1603
7
原创 Linux——Ubuntu的基础操作
创建文件 a.c和b.ctouch a.c touch b.c 压缩文件a.c和b.cgzip a.c gzip b.c解压缩a.c.gz和b.c.gzgzip -d a.c.gz对文件夹进行压缩gzip -r对文件夹进行解压缩gzip -rd注意:这只是对文件夹里所有文件进行压缩,并不进行打包服务压缩文件bzip -z a.c 对文件a.c进行压缩 tar工具参数-f:使用归档文件-c:创建新归档(压缩)-x:从归档中解出文件(解压缩)-j:用bzip2格式压缩-z:用gzip格式压缩-v:打印出命令
2024-11-02 01:00:39
1508
33
原创 Linux——Ubuntu终端操作与Shell命令
进行安装net-tools,安装过程中如果出现无法解析域名cn.archive.ubuntu.com的话,就去设置里面关闭手动设置DNS试一下。不是root用户,但拥有root用户的临时权限,例如我们安装一些软件,就需要用sudo去开放权限。跟windows的剪切是差不多的作用,在ubuntu中也有重命名的作用。进行查找,./表示在当前目录的test文件夹中有a.c文件。文件夹,zzs因人而异,根据自己的系统文件夹而定)打开终端,默认进入的是主目录,也就是。删除a.c和b.c不用加-rf。
2024-10-22 15:54:54
1503
10
原创 数据结构——哈夫曼树及其应用(哈夫曼编码)
若将编码设计为长度不等的二进制编码,即让待传字符串中出现次数较多的字符采用尽可能短的编码,则转换的二进制字符串便可能减少。关键:要设计长度不等的编码,则必须使任一字符的编码都不是另一个字符的编码的前缀。(这种编码称为前缀编码问题:什么样的前缀编码能使得电文总长最短?——哈夫曼编码1、统计字符集中每个字符在电文中出现的平均概率(概率越大,要求编码越短2、利用哈夫曼树的特点:权越大的叶子离根越近;将每个字符的概率值作为权值,构造哈夫曼树。则概率越大的结点,路径越短。
2024-10-17 22:31:22
2243
34
原创 FreeRTOS——中断管理
中断是一种机制,用于处理高优先级的事件或故障。当一个中断事件发生时,单片机可以立即中断正在执行的程序,转而处理中断事件。这种机制可以提高系统的响应速度和实时性。
2024-10-17 09:47:27
948
14
原创 FreeRTOS——任务挂起、任务恢复API函数使用及内部实现剖析
挂起任务类似暂停,可恢复;删除任务,无法恢复。恢复任务:恢复被挂起的任务。:在中断中恢复被挂起的任务。
2024-10-13 20:46:32
783
24
原创 FreeRTOS——空闲任务和钩子函数介绍
钩子函数是操作系统(FreeRTOS)满足某些功能的机制,FreeRTOS调用钩子函数,但钩子函数的实现由开发者(用户)完成。可以将之理解成回调函数。大部分的钩子函数都能在“FreeRTOSConfig.h”中通过宏进行剪裁。
2024-10-13 11:53:54
1773
23
原创 数据结构——树和森林
把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则 n个结点有n个孩子链表(叶子的孩子链表为空表)。实现:用二叉链表(三部分:数据域,两个指针域:一个指向左孩子,一个指向右孩子)作树的存储结构,链表中每个结点的两个指针域分别指向其。1)加线:若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子..…1)抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二又树。我们可以通过增加结点的信息,将双亲的下标添加到每个结点的结构体中,这叫做。
2024-10-11 23:16:03
1396
3
原创 FreeRTOS——TCB任务控制块、任务句柄、任务栈详解
使用任务句柄,可以通过 FreeRTOS 提供的 API 函数对任务进行操作,例如挂起(suspend)、恢复(resume)、删除(delete)任务,或者查询任务的状态等。这个函数用于创建新的任务,其中的 “prv” 表示该函数是一个私有函数,只用于内部处理和初始化新任务的操作。任务控制块是 FreeRTOS 中用于描述和管理任务的数据结构,包含了任务的状态、优先级、堆栈等信息。每个创建的任务都会分配一个唯一的任务句柄,通过该句柄可以对任务进行操作和管理。每个任务都有自己的任务控制块,类似身份证。
2024-10-10 23:12:38
2468
4
原创 FreeRTOS——系统配置文件FreeRTOSConfig.h详解
1. configSUPPORT_STATIC_ALLOCATION宏定义配置/* 1: 支持静态申请内存, 默认: 0 */当宏 configSUPPORT_STSTIC_ALLOCATION 设置为 1 时,FreeRTOS 支持使用静态方式 管理内存,此宏默认设置为 0。
2024-10-08 20:20:26
2210
原创 数据结构——遍历二叉树
遍历定义-- 顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(又称周游)。“访问”的含义很广,可以是对结点作各种处理,如:输出结点的信息、修改结点的数据值等,但要求这种访问不破坏原来的数据结构。遍历目的-- 得到树中所有结点的一个线性排列。遍历用途--它是树结构插入、删除、修改、查找和排序运算的前提,是二又树一切运算的基础和核心。遍历方法依次遍历二叉树的三个组成部分,便是遍历了整个二叉树。
2024-10-07 17:03:47
2831
1
原创 数据结构——二叉树的性质和存储结构
初始条件:definition给出二叉树T的定义。操作结果:按definition构造二叉树T。初始条件:二叉树T存在。操作结果:先序遍历T,对每个结点访问一次。初始条件:二叉树T存在。操作结果:中序遍历T,对每个结点访问一次。初始条件:二叉树T存在。操作结果:后序遍历T,对每个结点访问一次。二叉树的性质和存储结构在二叉树的第i层最少有1个结点。深度为k的二叉树最少有k个结点。
2024-09-28 12:04:07
962
原创 数据结构——初识树和二叉树
树是由根和子树组成,子树又是由子树的根和子树的子树组成,是一个递归的(嵌套的)结构。示意图如下:树的其他表现方式为何要重点研究每结点最多只有两个的树?二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二又树,不失一般性。普通树(多又树)若不转化为二又树,则运算很难实现二叉树在树结构的应用中起着非常重要的作用,因为对二叉的许多操作算法简单,而任何树都可以与二叉树相互转换,这样就解决了树的存储结构及其运算中存在的复杂性。二叉树。
2024-09-26 22:55:54
1224
原创 FreeRTOS——任务调度、任务状态
首先我们的Task3优先级最高,会从就绪列表中取出Task3优先执行使其转为运行态,当Task3进入阻塞态(系统延时或等待信号量)时,就会把Task3放入阻塞列表,执行就绪列表中任务优先级高的其他任务Task2,Task2进入运行态,如果将Task2用pxSuspendTaskList使其挂起,这时Task2进入挂起列表,这时运行就绪列表中的Task1,使其进入运行态,这时Task2要解挂要调用pxSuspendTaskList。创建三个任务:Task1、Task2、Task3,他们的优先级相同,均为1。
2024-09-26 11:09:22
739
原创 数据结构——广义表
(又称列表Lists)是n>=0个元素a0,a1,...,an-1的有限序列,其中每一个ai可以是原子,或者是一个广义表。(6)广义表是多层次结构,广义表的元素可以是单元素,也可以是子表,而子表还可以是子表,...。:线性表的元素是单一的类型,而广义表的元素可以是不同类型,其元素也可以是一个广义表(子表)。(1)求表头GetHead(L):非空广义表的第一个元素,可以是一个原子,也可以是一个子表。(5)广义表可以是一个递归的表,如:F = (a1,F)这种把自身当作元素的广义表。tag 标记位和原子的值。
2024-09-25 17:11:49
1962
原创 数据结构——数组
元素aij的存储位置为:前面有(i-1)行,所以是1+2+3+...+(i-1),然后是第j列,前面i行的元素(利用等差数列公式)总个数再加(j-1)个元素再加上初始位置就是aij元素的位置。【特点】在n x n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。:数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。若多个数据元素的值都相同,则只分配一个元素的存储空间,且零元素不占存储空间。
2024-09-25 12:28:16
1101
原创 数据结构——串的模式匹配算法(BF算法和KMP算法)
确定主串中所含子串(模式串)第一次出现的位置(定位)搜索引擎、拼写检查、语言翻译、数据压缩BF算法(Brute-Force,又称古典的、经典的、朴素的、穷举的)又称暴力破解法KMP算法(特点:速度快)
2024-09-22 21:59:13
1927
原创 STM32F103C8T6用USB供电时设备无响应问题
总之我们如果要使用USB给单片机供电,PA11和PA12这两个引脚口最好不要使用,特别是作输入引脚。在使用io口,尽量看引脚定义图里这些IO口是否为特殊功能引脚,尽量避开这些引脚,避免掉坑。从上面引脚定义图可以发现,USB的D-和D+分别接到PA11(USBDM)和PA12(USBDP)上,PA12(USBDP)即D+通过跳线使上拉1.5K电阻到VCC(3.3V)浮空输入 GPIO_Mode_IN_FLOATING。推挽输出 GPIO_Mode_Out_PP。开漏输出 GPIO_Mode_Out_OD。
2024-09-18 10:15:40
634
原创 数据结构——串的定义及存储结构
串(string)——零个或多个任意字符组成的有限序列串是内容受限的线性表串的几个术语子串:串中任意几个连续字符组成的子序列称为该串的子串(真子串是指不包含自身的所有子串)主串:包含子串的串相应地称为主串字符位置:字符在序列中的序号为该字符在串中的位置子串第一个字符在主串中的位置空格串:由一个或多个空格组成的串 与空串不同串相等:当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才时相等的。
2024-09-16 20:05:09
663
原创 STM32使用ESP-01S连接WiFi通过云平台与手机APP联动
订阅和发布是一种消息通信模式。在该模式中,有两类参与者:发布者和订阅者。发布者负责产生和发布消息,它们不关心消息是谁接收和处理的。发布者将消息发送到一个中心位置,通常称为消息队列或主题。它们有时也被称为发布/订阅中心。订阅者负责订阅感兴趣的消息。它们告诉发布/订阅中心它们希望接收哪些类型的消息。一旦有消息与其订阅条件匹配,订阅者将接收到该消息。订阅和发布模式的一个重要特点是解耦。发布者和订阅者之间没有直接的联系,它们之间通过发布/订阅中心进行通信。
2024-09-16 17:25:04
2138
原创 TCP和MQTT通信协议
MQTTMQTT(Message Queuing Telemetry Transport)协议是一种轻量级的发布/订阅消息传输协议。它专门设计用于在低带宽和不稳定的网络环境下传输消息。其采用发布/订阅模式,其中客户端可以发布消息到主题(Topic),而其他客户端可以订阅这个主题来接收消息。这种模式使得MQTT非常适用于物联网设备之间的通信,因为它可以提供高效的消息传递和降低网络流量。它非常轻量,以至于可以在低功耗和资源受限的设备上运行。
2024-09-15 16:04:11
2496
原创 数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)
队列和栈一样,也是限定只能在表的“端点”进行的线性表。队列在插入的时候,只能在表尾进行插入,在删除的时候,只能在表头进行删除。(先进先出),表尾即队尾,表头即队头。栈和队列是线性表的子集(是插入和删除位置受限的线性表)由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具。队列的逻辑结构与同线性表相同,仍为一对一关系。队列的存储结构有顺序队和链队,以循环顺序队列更常见。关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同。
2024-09-13 18:37:53
1362
原创 数据结构——栈和队列(栈的顺序存储结构和链式存储结构)
栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式。就像我们刚才的例子,栈这种后进先出的数据结构应用是非常广泛的。在生活中,例如我们的浏览器,每次点击一次“后退”都是退回到最近的一次浏览网页。例如我们Word,Photoshop等的“撤销”功能也是如此。再例如我们C语言的函数,也是利用栈的基本原理实现的。官方定义栈(stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。
2024-09-12 17:12:12
1709
5
原创 STM32CubeMx学习笔记——GPIO使用
1、选择芯片型号2、配置时钟RCC选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷器)3、时钟树配置在clock Configuration中将HCLK配置为最高频率然后回车4、选择调试模式SYS 设置,选择 Debug 为 Serial WireTimebase Source时钟源可以选择SysTick。
2024-09-10 00:06:44
1306
原创 数据结构——线性表(静态链表、循环链表以及双向链表)
在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点;没有解决连续存储分配(数组)带来的表长难以确定的问题;失去了顺序存储结构随机存取的特性。静态链表其实是为了给没有指针的编程语言设计的一种实现单链表功能的方法。
2024-09-09 20:37:11
895
原创 数据结构——线性表(顺序存储结构和单链表结构)
线性表(List):由零个或多个数据元素组成的有限序列。(1)它是一个序列,也就是元素之间有个先来后到的;(2)若元素有多个,则第一个元素无前驱,最后一个无后继;(3)线性表是有限的;原子类型:不可以再分解的基本类型,例如整形、浮点型、字符型等结构类型:由若干个类型组合而成,是可以再分解的,例如整形数组是由若干个整形数据组成的。抽象数据类型抽象数据类型是指一个数学模型及定义在该模型上的一组操作;抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
2024-09-08 22:01:58
1008
原创 数据结构——时间复杂度和空间复杂度
在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。算法在运行过程中临时的额外占用存储空间大小 ,在该函数中,额外开辟的空间只有 end,i,exchange都是常数个,冒泡排序中数组的数据不算,并不是算法逻辑的需求额外开辟的空间,而是本身就提供的.动态开辟了N个空间,空间复杂度为 O(N)
2024-09-08 17:55:27
1257
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人