- 博客(43)
- 收藏
- 关注
原创 硬件-DAY08(中断)
将这些文件分为4类,并保存到4个不同的文件夹里。首先在新的工程文件夹里创建一个之后我们编写的类似led驱动,clk驱动等等外设驱动程序都放在这文件夹里面,;再,存放 start.s和 main.c 文件,也就是应用文件;一个,用来保存NXP的相关库cc.h、fsl_common.h、fsl_iomuxch和 MCIMX6Y2.h 这四个文件;最后再创建一个,用来存放编译生成的.o 文件。
2025-06-24 21:47:36
536
原创 硬件-DAY07(GUN工具链常用工具、SDK工具及链接脚本)
common区:全局变量且赋值了的1. .bss段用于存放未初始化或初始化为0的数据在运行时会被自动清零- 典型例子:// 静态变量(全局或局部)// 显式初始化为0的全局变量2.COMMON段用于存放未初始化的非静态全局变量链接时才确定最终大小和位置允许多个目标文件定义同名符号- 典型例子://未初始化的非静态全局变量3. .data段用于存放已初始化的全局变量和静态变量(非零值)需要在程序文件中保存实际的初始值- 典型例子:// 初始化为非零值。
2025-06-23 20:12:26
1124
原创 硬件-DAY06(arm启动代码)
2.对函数声明:import(导入) export(导出), {r0-r12, lr}(2) 于r0中,设置相关数据,设为User模式(10000)(1) msr指令:读取cpsr、spsr寄存器。(3) msr指令:写入cpsr、spsr寄存器。在汇编中,声明c的函数,import main。保护时,SP先写,再加;恢复时,SP先减,再读;保护时,SP先加,再写;恢复时,SP先读,再减;保护时,SP先减,再写;恢复时,SP先读,再加;保护时,SP先写,再减;恢复时,SP先加,再读;
2025-06-22 22:49:50
947
1
原创 硬件-DAY05(ARM基础知识、ARM的指令)
ps:flash闪存中,ARM的指令集:ARM指令集(32bit)、Thumb指令集(16bit)
2025-06-20 19:40:11
1274
原创 硬件-DAY04(ds18b20、ARM内核)
当上拉和下拉电阻都不开启时,GPIO引脚处于浮空模式,此时引脚的电压是不确定的,可能会随时间改变。BUS总线分为AHB总线(先进的高速设备)和APB总线(先进的低俗设备)6.MMU:memory management unit,内存管理单元(内存映射)R(应用于实时性方向,如军事,通信)初始化(复位)--- 写操作 --- 读操作 --- 获取温度。dCache:数据Cache,所以ARM是哈弗结构。3.SP:栈指针寄存器(在硬件物理层的指针,来管理栈区)4.PC:程序计数器,PC指到哪,程序就执行到哪。
2025-06-19 19:38:26
1169
原创 硬件-DAY03( UART及modbus)
常见的波特率有1200、2400,4800,9600,115200等,表示每秒钟传输的比特数。校验位分为奇校验,偶校验和无校验。传输速率较高,但会占用大量的芯片资源传输速率较高,但会占用大量的芯片资源.1)TTL(Transistor-Transistor Logic)通常指的就是芯片引脚产生的电压,这个电压值跟选择的芯片有关,3)同理RS485使用两根信号线(A和B)来传输数据,通过比较A和B之间的电压差来识别信息,电压范围分别为。,RS485在传输数据的某一时刻,两根线都要用到,所以它是。
2025-06-19 18:09:49
1053
原创 硬件-DAY02(按键、中断、定时器、蜂鸣器)
当GATE(TMOD.3)=0,TR0=1时就允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR1=0且INT0输入。当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。4.51单片机中5个中断源:外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断。2.中断源:能够打断当前工作任务的事件(外部中断)二、中断处理(由kernel处理)
2025-06-17 20:18:00
481
1
原创 硬件-DAY01(LED点灯、共阴极数码管)
RAM:随机访问存储器、易失性存储器,(地址总线有8个端口,一共有256个字节)RAM中有128位、数据在RAM 中,保存后就会存到ROM中。3.P0(0x80)、P1(0x90)、P2(0xA0)、P3(0xB0)寄存器(系统提前定义好的全局变量)P0控制位选、P1控制段选(LEDS1、LEDS2、LEDS3、LEDS4)四小项:51单片机(8051内核)、IMX6ULL、系统移植、驱动。2.CPU(中央处理单元) MCU(微控制器单元)soc(特殊的cpu)四、数码管(共阴极数码管)
2025-06-16 19:27:29
633
1
原创 Linux系统编程-DAY13(事务、页面制作、HTTP协议)
name<img src="abc.jpg"></sup>:上标 <br>100m<sup>2
2025-06-11 20:08:28
700
原创 Linux系统编程-DAY12(数据库)
eg:insert into user1 values (2,'张三',23,datetime('now','+8 hours'));ps:以上表的表字段,支持如下数据类型:int text real(小数数据) blob(二进制数据)。create table 表名(表字段1 类型,表字段2 类型, ......);
2025-06-10 18:16:28
1074
原创 Linux系统编程-DAY11(多路复用IO)
函数原型:int select(int nfds, fd_set *readfds, fd_set *wirtefds, fd_set *exceptfds, struct timeval *timeout);3.epoll显著提高性能的前提是:监听大量描述符,并且每次触发事件的描述符文件非常少。4>epoll把准备就绪的fd,放入rev集合中(这里的集合可以理解为数组)功能:将指定的set集合中编号为fd的描述符号删除。功能:将指定的fd描述符,添加到set集合中。如果在则返回真,否则返回假。
2025-06-09 22:05:52
873
原创 Linux系统编程-DAY10(TCP操作)
1.服务端:socket()---> bind()--->listen()--->accept()--->recv()--->send()--->close()2.客户端:socket()--->connect()--->send()--->recv()--->send()(1)流式套接字:全双工(既能收也能发)(因为是双缓冲区(发送缓冲区和接收缓冲区))1-3三次握手(建立连接),4-7处理数据(收发),7-10四次挥手(断开连接)有顺序的(数据会有序到达)(发和收的次序可不对应)
2025-06-05 20:27:50
924
原创 Linux系统编程-DAY09(网络编程)
网络层: IP ICMP(ping) RIP OSPF IGMP ...(IP:互联网协议、ICMP互联网管理协议,用于做网络检测和诊断用、RIP 最短路径、OSPF 最佳路径、IGMP)数据链路层:负责物理相邻(通过网络介质相连)的主机间的数据传输,主要作用包括物理地址寻址、数据帧封装、差错控制等。1)socket 套接字 ---> BSD socket ---> 用于网络通信的一组接口函数。tcp:高成本发送数据(在网络中一种可靠的传输方式),缺点:网络延迟有点大,网络开销大。
2025-06-04 20:01:29
865
1
原创 Linux系统编程-DAY07(线程的异步与同步)
linux下的线程同步 --->信号量机制 --->semaphore.h posix。框架:信号量的定义--->信号量的初始化 --->信号量的PV操作--->信号量的销毁。定义互斥锁 ---> 初始化锁 ---> 加锁 ---> 解锁 ---> 销毁。2.线程的同步 ---> 同步 ---> 有一定先后顺序的对资源的排他性访问。P --->申请资源--->申请一个二值信号量。V --->释放资源--->释放一个二值信号量。P操作对应函数 --->sem_wait();
2025-05-28 20:54:51
834
原创 Linux系统编程-DAY06(线程)
2: 强制退出 --> 他杀 --> 主线程结束子线程 int pthread_cancel(pthread_t thread);功能:通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。线程启动时,需要在栈区开一个8M的空间,进程拿到的资源,对于线程是共享的。1.创建多线程 --->线程空间操作 --->线程资源回收。2. arg 回调函数的参数,即参数3的指针函数参数。2)主线程调用:填入刚才创建的线程的线程号。
2025-05-27 20:17:39
853
2
原创 Linux系统编程-DAY05(进程相关操作)
退出状态,终止的进程会通知父进程,自己使如何终止的。如果是正常结束(终止),则由exit传入的参数。如果是异常终止,则有内核通知异常终止原因的状态。任何情况下,负进程都能使用wait,waitpid获得这个状态,以及资源的回收。功能:该函数可以阻塞等待任意子进程退出,并回收该进程的状态,一般用于父进程回收子进程状态。exit -> 刷新缓存区 -> atexit注册的退出函数 -> _exit。僵尸进程:进程执行结束但空间未被回收变成僵尸进程。参数:status:进程退出的状态。只能父进程回收子进程。
2025-05-26 19:01:04
640
原创 Linux系统编程-DAY04(进程、父子进程)
程序执行的过程,包括进程打的创建、调度、消亡 .c ----> a.out --- > process(pid)写时复制:子进程数据段只有发生变化的值,才会定义,其他的共享父进程的。子进程复制父进程的0到3G空间和父进程内核中的PCB,但id号不同,一般子进程的id号大一些。内存开始的地址是0G,结束的地址是3G,内核是3G,结束的位置是4G。进程打开的文件列表, 文件IO中有提到,每开一个文件,pcb块都会有记录。子进程是父进程的副本,子进程获得父进程数据段,堆,栈,正文段共享。
2025-05-25 23:50:18
1666
原创 Linux系统编程-DAY03(文件IO、文件夹)
1.lseek函数: off_t lseek(int fd, off_t offset, int whence)9. time_t time (time _ t *tloc) 头文件<time.h>7.目录:(1)打开opendir(2)读取目录readdir (3)关闭closedir。-------DIR *dir------- (系统结构体)目录流指针。DT_BLK 块设备 DT_CHR 字符设备。DT_REG普通文件、DT_SOCK网络文件。2.fileno.c函数。
2025-05-22 20:08:06
689
2
原创 Linux系统编程-DAY02(标准io、文件io)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) ptr一般为数组,第一个size表示多大,第二个size表示份数。O_APPEND O_CREAT O_TRUNG (eg:创建文件: O_WRONLY | O_CREAT | O_TRUNG )stdin -> 标准输入,终端,键盘scanf,gets,getchar。- rw-rw-r-- 作者,组,其他 (-普通文件 d目录)
2025-05-21 20:13:41
1839
原创 Linux系统编程-DAY01(标准io)
eg:---> stdio.h ---> stdio.c ---> libc.so --> /usr/ lib so动态库(lib.c so 此时是一个二进制文件,也叫库文件)读完返回null(文件到达结尾或出错,一般当作到达结尾),文本文件开空间时,大小建议开1~4K。一、系统编程(大量的函数)属于应用程序编程,系统编程是操作系统走完程序后,才运行我的程序;<> 是系统库函数,默认路径: /user/include。1.文件:文件操作的步骤:打开 --> 读写 --> 关闭。
2025-05-20 18:19:05
618
原创 数据结构-DAY06(树、哈希表、内核链表)
3,完全二叉树,对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这可树为完全二叉树。3.基本原理:哈希表的核心是哈希函数,它将任意大小的数据映射到固定大小的值(通常是一个整数),这个值称为哈希值。3,任意一个二叉树T,如果其叶子结点的个数是n0,度数为2的结点数为n2, n0 = n2 +1;1,斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。1,在二叉树的第i层上最多有2^(i-1)个结点 i>=1。
2025-05-19 19:27:06
1183
2
原创 数据结构-DAY05(栈和队列)
1.栈是限定仅在表尾进行插入和删除操作的线性表。1.队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。允许插入的称谓队尾,允许删除的一端队头。栈底:不允许操作的一端入栈,出栈。队列分为:顺序队列,循环队列,栈分为:顺序栈 链式栈。常用操作:出队、入队。栈顶:允许操作的一端。3.优先级就是通过栈来解决的。2.满队:尾 + 1 = 头。2.栈结构是在堆区创建的。先进后出,后进先出。3.空队:尾 = 头。
2025-05-18 23:38:32
328
原创 数据结构-DAY04(Makefile和双向链表)
敲下make :make会在当前目录下去寻找file,默认走第一条规则;使用make clean 走第二条规则, make clean删除预期文件和中间文件。在.c文件非常多的情况下,当修改后,只编译被修改的.c文件,节省时间,提高效率。指定make file的规则文件:make -f Makefile2。注意:无论版本1还是版本2,回车之后的,下一行使用Tab键打出空挡。首先,使用vi Makefile进行代码编写。5.双向链表-按位置插。2.双向链表-头插法。4.双向链表-尾插法。
2025-05-15 18:27:45
518
原创 数据结构-DAY03(单向链表)
1.gcc -g (加上调试选项 -g, eg: gcc main.c linklist.c -g)(3)b fun.c :36 设置断点,运行到这个位置程序暂停。2.gdb a.out (调试可执行文件, eg :gdb ./a.out)(2)gdb a.out (可执行文件名)(6)使用p命令,查看变量或指针等数据。3.按r(run)直接开始运行。3.找出单向链表中的中间数据。6.判断单向链表是否为环状。(7)list,看源码。2.单向链表 销毁函数。(5)n 执行下一步。7.单向链表插入排序。
2025-05-14 20:51:03
215
原创 数据结构-Day02(单向链表)
为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。特点:线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。在链式结构中还需要一个元素存储下一个元素的地址。<2>链表非空 。解决顺序存储的缺点,插入和删除,动态存储问题。
2025-05-13 19:25:22
261
原创 数据结构-day01(顺序表)
7.时间复杂度:O(N) < O(logN) < O(N logN) <O(N^2) < O(N ^ 3) < O(2 ^ N) < O(N!算法的特征:(1)输入(2)有穷性(3)确定性(4)可行性。(1)顺序存储,数据存放在连续的存储单元中,逻辑关系和物理关系一致。2.逻辑结构:(1)集合,所有数据都在一个集合中,关系平等。(2)链式:数据存放的存储单元是随机或任意的,可以连续也可以不连续。(2)线性,数据和数据之间是一对一的关系,如数组。(1)顺序表:类似于数组(Seqlist)
2025-05-12 20:17:20
256
原创 结构体与位运算
(3)把每个成员按照声明顺序依次存入内存,偏移量/sizeof(成员)必须能够被整除。也可以声明时赋值,但个成员的值不能相同,未赋值成员默认上一个成员的值加一。week变量的值只能是列举出成员的值,这些成员的值默认从0开始,依次叠加。(2)从结构体中的成员查找最大成员字节成员,最终大小为最大字节的整数倍。(1)默认按照计算机位数对其,最终大小为8(或4)的整数倍。3.结构体中,指针传参比起值传递,代码的运行效率更高。6.枚举中,要是要赋值,不要对俩个枚举名赋同样的值。此时,成员值是最后一个赋值成员的值。
2025-05-12 00:21:54
189
1
原创 !指针函数
/申请多大的内存 如:n * sizeof(int);(int argc, const char *argv[])这里的argc相当于len,argv相当于a[];getMemory是一个指向指针的指针,char *(char *型变量) *p(指针p);申请到的size的字节,在内存上一定连续。i为局部变量,指针函数不能返回局部变量,当调用函数的时候,i的空间已经销毁。指针的数组作为函数参数传递时,形参一定是指针的指针。(1)二维数组作为函数参数,形参为指向数组的指针。
2025-05-08 17:27:43
340
原创 字符型指针
6. void * 称为万能指针,可以接受任何类型的指针。5.字符串如果相同,地址就一样,只要有一个元素不同,地址就不同。二维数组名相当于指向长度为一维数组长度的数组指针,一维数组名相当于指针。8.数组指针:int (*p)[10]指向长度为10的整型数组的指针。2.指针保存在栈区,不能去修改字符串的元素,字符串在字符串常量区。在指针变量中,const用来表明不能通过该指针修改指向的变量。a[0] == &a[0][0] 基类型为int *型;a == &a[0] 基类型为 int(*)[len];
2025-05-07 18:24:45
189
原创 数组与指针
4.NULL为空指针 --> 代表指针的一种状态,为0;(2)先从右往左找第一个比基准数小的数。如果俩个指针基类型相同,可以求差值,如:p - q相差了几个基类型。3.指针不能写成*a++,a是一个地址值常量,为右值,不能自增。5.int *binaryFind 为指针型函数,返回值为指针。1.地址相加,实际上是向后偏移sizeof(基类型)个字节。2.不是数组的话,地址加n后输出,此时为野指针。(3)再从左往右找第一个比基准数大的数。8.指针相加:左边为指针,右边为常量。6.指针比较时,基类型要一致。
2025-05-06 19:25:14
179
原创 预处理命令和指针的概念
一般形式为: #define 宏名(参数表)字符串 如:#define S(a,b) a * b。4.&和*在大部分时候可以抵消(&*i不行,从右往左进行计算,因为i里保存的不是地址,不能*i)3.在64位系统下,所有的指针都占8字节。定义指针变量的一般形式为:基类型 * 指针变量名(其中的*是类型说明符)5.野指针/疯指针:随机数的地址(如*i),此时编译的话程序会崩。ps:*p就是i本身;(2)从定位处开始往后偏移sizeof(基类型)个字节。在进行宏定义时,可以应用已定义的宏名,可以层层置换。
2025-05-02 14:04:07
263
原创 C语言:函数(第三部分)
二维数组作为形参时,列数的值要写死,行数只能在主调函数里面计算,被调函数里面只能算列数的值。2.在全局变量前加上static,意为限制变量在当前文件中,在函数前加static同理。4.在两个或多个具有包含关系的作用域中定的同名标识符,外层标识符在内层不可见。2.动态生存期:所有的局部变量都有动态生存期,在栈上的数据也都有动态生存期。2.全局作用域:花括号以外的变量称为全局变量,从定义的那一行到结束。1.静态生存期:与程序的运行周期相同,所有的全局变量都有静态生存期。3.全局变量是在静态区或全局区。
2025-04-29 23:44:37
171
原创 C语言:函数(第二部分)
当被传的参数是数组时,传递首地址,即为传地址,此时被调函数就可以通过定位主调函数的地址值进行修改主调函数的值。3.(1)整型数组作为函数调用要传俩个参数,一个数组名(即首元素地址),可以不加数组长度,另一个是数组长度,因为被调函数中求不出数组的自身长度,所以我们传一个数组长度的值给形参。(2)但在字符串数组中,可以只传一个数组名,因为在形参中字符串数组的长度可以省略,所以也不需要传一个数组长度的进去。5.字符型数组作为实参时,可以不传递len,因为字符型数组本身就是容器,所以len可以省略。
2025-04-28 19:19:42
280
原创 C语言:函数(第一部分)
4.程序运行过程中,通过寄存器PC(程序计数器)来指向下一条指令,此时上一条指令正在运行,指向的第一条指令就是函数的。(2)在定义的函数中一定要写return,return返回值要和定义函数的类型标识符一样或者相兼容。返回地址即为被调函数调用完后回到主函数的位置,这就是出栈,也称为恢复现场。(1)通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。出即为出栈,可以理解为恢复现场。同理也有入栈,进去被调函数前,把当前主调函数执行的地址放入栈区。调用此函数时,什么工作也不做,没有任何实际的作用。
2025-04-27 18:34:14
310
原创 二维数组的定义和引用
1.(1)分行给二维数组赋初值时:int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};要注意的是,如果int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13};需要注意的是主对角线都是a[i][i]类型的,辅对角线都是a[i][rows - i -1]类型的。(3)也可以对部分元素赋初值:int a[3][4] = {{1},{5},{9}};如:int a[3][4];数组名[下标][下标],如:a[2][3]。
2025-04-25 18:17:13
442
原创 字符型数组
4.char s[100],字符型数组s可以理解为容器,如果一个字符型数组为用字符初始化的,则{ },可以省略,如:char s[ ] ={"Hello World"};意为遍历字符型数组,输出。(2)而fgets则更为全面,char *fgets(char * s,int size,stdin);(3)scanf在打印字符型数组是,不用&符号,因为s就是字符型数组s中的首地址;需要注意的是,s1和s2拼接在一起后的长度最小应该为:strlen(s1) + strlen(s2)+ 1。
2025-04-24 17:29:40
403
原创 C语言:数组的的定义和引用
(2)在对全部数组元素赋初值的时候,如果数据的个数已经确定,则可以不指定数组的长度。如:int a[5] = {1,2,3,4,5};可以写成 int a[ ] = {1,2,3,4,5};(3)若不想去数没有指定数组长度的里面数的个数,可以定义一个len,将len = sizeof(a) / sizeof(a[0])来判断数组中的个数。(5)数组的数组名是数组的首元素的地址值。(3)超出常量表达式的范围的值叫做越界访问,会造成不可估计的后果。(5)数组是从a[0]开始的。(4)数组是不能被整体访问的。
2025-04-23 21:09:26
211
原创 C语言的循环控制
循环嵌套中,内循环进行一次遍历,外循环运行一次,i%j即为2 % (2~100),判断出其中的质数,然后3 % (2 ~ 100),依次类推,计算出100内所有的质数。内部循环为外部循环的结构体,外部循环其实只负责提取出一些数据给内部循环使用,假如n = 3,则 第一次 1*1 第二次 1*2 第三次 1*2*3,最后加起来输出。3.循环的嵌套:循环嵌套式,内层循环整个走一遍,外层循环才会走一次。1.(1)i在循环中,称为循环变量,使用循环变量时,要对其进行。,即循环至少会循环一次,而while循环是。
2025-04-22 18:43:10
314
原创 选择结构程序设计
可以理解为:表达式和常量表达式1相等时,执行语句1,若不相等,再去判断常量表达式2,依次往下,找到相等的常量表达式即可输出对应的语句。3.表达式截断: 在与运算中,左表达式为假,则右边截断;在或运算中,左表达式为真,则右边截断。4.不管逻辑与和逻辑或,结合在一起运算时,不用管优先级,自左向右依次判断。2.switch(A)中,A必须是整型或整型相兼容,不能是浮点型。2.做等值比较时,写成 0 == i会好一点,常量写在左边,在逻辑表达式中,非0即为真,如:-10,这个就为真。如果1为真,则输出2;
2025-04-21 19:38:25
328
原创 逗号运算符、字符数据的输入与输出、格式输入与输出
中不出来,导师printf函数会一直提示error,这时我们可以在printf函数下再加一个while循环,添加一个getchar()函数,去取出缓冲区的值,以此来给用户第二次输入的机会,直到正确输入后方可跳出循环。2.这个题需要我们从终端获得俩个2位数,降低一个数的个位作为新数的千位,将第二位数个位作为新数的百位,将第二个数的十位作为新数的十位,将第一个数的十位作为新数的个位并打印该新数。单精度要用scanf("%f",&f)。(2)%%相当与一个%,如:"99.9%%"输出的结果就是99.9%。
2025-04-18 18:38:03
698
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人