- 博客(54)
- 收藏
- 关注
原创 S3C2440定时器
选择定时器的模式,以及打开定时器,注意,在定时器更新这个,先置1,再清0,对该位进行设置的目的是让定时器知道TCNTB里面的数值发生改变。注意先设置这个,因为这个buf里面存的数据是定时的次数,所以,要先写其,否则后面写他,定时器不知道该有没有更新。5、注意,对于不同的引脚进行设置不同的模式的时候,我们要到IO 模式设置不同IO的工作模式。2、配置定时器配制寄存器1(TCFG1),选择那个通道是有效的,并配置最终的分频占比。根据不同的要求,选择不同的定时器,例子1 ,选择定时器4,不需要PWM。
2024-09-22 20:06:35
607
原创 S3C2440中断
在指定中断源的中断服务程序中,必须通过清除SRCPND寄存器的相应位来正确的获得来自相同源的中断请 求。中断挂起(INTPND)寄存器 中断挂起寄存器中32位的每一位都表明了是否相应未屏蔽并且正在等待中断服务的中断请求具有最高的优先 级。如果某个指定为被设置为1,则CPU不会去服务来自 相应中断源(请注意即使在这种情况中,SRCPND寄存器的相应位也设置为1)的中断请求。中断偏移(INTOFFSET)寄存器 中断偏移寄存器中的值表明了是哪个IRQ模式的中断请求在INTPND寄存器中。soc中断的执行流程。
2024-09-21 20:01:39
687
原创 常见汇编指令
CMP比较指令用于比较两个寄存器的值或者比较一个寄存器和立即数的值,其原理是对待比较的两个数求差,看结果是否为0,这个指令会无条件修改N,V,C,Z位。汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位。将R0寄存器中的数据存储到R1寄存器指向的内存地址加上R2寄存器的值的位置。将R0寄存器中的数据存储到R1寄存器指向的内存地址中,并将R1的值增加4。将R0寄存器中的数据存储到R1寄存器指向的内存地址加上4的位置。
2024-09-19 20:33:47
772
原创 嵌入式基本知识梳理
由于电容会随时间慢慢放电,因此需要定期刷新(或再生)来保持存储的数据。2、静态存储使用触发器(如双稳态电路)或类似的稳定电路来存储数据,这些电路能够在没有电源的情况下保持其状态,因此不需要定期刷新。不同的工作模式,有不同的栈区,每一个不同的栈区的指针都要做不同的初始化,所有的共用一个pc,cpsr,当前点额状态只有一个。CPU:中央处理器-----》soc(片上系统)(描述的是一种芯片,这个芯片具有运算程序的能力)、只有一个的称为(单核),(两个以上)多核。3、按存储内容的可变性分ROM与RAM。
2024-09-18 19:54:15
2557
原创 获取时间,并将时间按一定的格式输出
/date 功能: 将时间秒数转化成字符串 参数: timep:保存时间空间的地址 返回值: 成功返回获得时间字符串的首地址 失败返回NULL。功能: 获得1970年到现在的秒数 第一步,先获得秒数再转成其他时间 参数: t:存放秒数的空间首地址 返回值: 成功返回1970年到现在的秒数 失败返回-1。1.获取秒数 CTS 北京时间 2.转换为需要个格式 系统时间的获取: 1.time 获得秒数 time_t time(time_t *t);可以根据需求来指定不同的格式化指令来输出不同的日期和时间格式。
2024-09-11 20:46:49
730
原创 帧缓冲 framebuffer
显示屏:800 * 600(横向有800个像素点,纵向有600个像素点)是什么:Linux内核为显示提供的一套应用程序接口。888(8个bitR,8个bit G,8个bit B)2、获取显示设备相关参数(分辨率、位深度......)framebuffer: 帧缓存、帧缓存(显示设备)framebuff(是什么,具体原理、怎么做、)为了提高代码的书写效率(将RGB扩充到4字节)1、打开显示设备(/dev/fb0)1、打开显示设备(/dev/fb0)显卡(显存(保存像素点的值))2、获取显示设备相关参数(
2024-09-10 21:59:53
751
原创 哈希表-数据结构
在这种方法中,哈希表的每个槽(slot)或桶(bucket)都关联一个链表,我们把具有相同属性的元素进行连接,最后只需要我们进行查找的时候只需要进行哈希映射,找到数组的地址之后,去遍历里面的链表,找到对应的元素。- **性能依赖于负载因子**:当哈希表的负载因子(即表中元素数量与槽数量的比率)较高时,链表可能会变得较长,导致查找效率下降。- **动态扩容**:随着元素的增加,可以动态地增加哈希表的大小,以保持负载因子在一个合理的范围内。1. **哈希函数**:首先,使用哈希函数将键映射到哈希表的一个位置。
2024-09-09 21:15:37
886
原创 排序算法总结
思想:给数组a 排序,将数据进行插入,但是要保证数组,插入之后的鼠标线还是有序的。5、把小于哨兵元素的那一部分和大于哨兵元素的那一部分分别递归调用本函数,依次递归排序好所有元素。思想:在数组合适的位置上放上合适的数,选定一定的位置,从后面的数据与该数据进行比较。2、从右往左找第一个比基准数小的数,将该数放到begin的位置。3、从左往右找第一个比基准点大的数,将该数放到刚刚挪到的位置。相同的数据排序后,相同的数据的相对位置未发生改变。思想:相邻两个元素两两比较,小的放前,大的放后。4、继续转而执行2、3,
2024-09-09 18:58:18
571
原创 树形结构-数据结构
也就是说一层一层进行入队,只要根结点不为空,那么我们就可以进行打印,出栈结点,出完之后再将其左右结点入队,再循环往复进行操作。在满二叉树的基础上,要删除结点的话,只能从右至左,从上到下,进行连续按照顺序删除,插入的顺序也是如此。实现,就是增加一个队列,将结点加入,加入之后,再将其的左右子节点的数据。也就是说,一层一层来,如果上一层没有插完,只能在上面插入)在不增加层数的前提下,增加结点,不能增加的树称为满二叉树。先遍历根节点,再按照前序结点遍历左子树,右子树。结点的度数不能超过2,或者说度为2的树称为2。
2024-09-08 16:54:43
1545
原创 队列-数据结构
循环队列是一种使用数组存储数据元素的线性数据结构,它利用数组的环状特性来处理队列的入队和出队操作。为了避免假溢出,可以在定义循环队列的时候预留一个位置,通常在初始化队列时,将front和rear都设置为0,但在判断队列满的条件中加入一个额外的判断条件,比如rear == front时队列为空,而(rear + 1) % queueSize == front时队列为满。顺序队列---------》假溢出-----------------》循环队列(如果用顺序队列里面,我们主要用的就是循环队列)
2024-09-06 18:49:35
629
原创 栈—数据结构
6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)入栈的方向是是增栈的方式,放入数据的是满栈的方式。入栈的方向是是减栈的方式,放入数据的是满栈的方式。入栈的方向是是增栈的方式,放入数据的是空栈的方式。入栈的方向是是减栈的方式,放入数据的是空栈的方式。3、出栈(看一下,出去的元素,所以和6一样)1、入栈:先放入输入,再移动栈顶指针。2、出栈:先移动栈顶指针,再数据弹出。1、入栈:先挪栈顶指针,再放入数据。2、出栈:先移出数据,再移动指针。
2024-09-06 14:55:54
1188
原创 内核链表基本知识
内核链表:可以给里面的每一个数据都可以存储不同的数据的类型,结构体成员里面(将结点放在数据中)第一个指针的前驱结点指向最后一个结点,最后一个结点的尾指针指向第一个结点。内核链表:有头的、双向循环链表。
2024-09-05 12:54:43
410
原创 天气预报爬虫
了解服务器断口的http请求的基本格式之后,充当客户端,对该服务器进行请求,服务器对发送的报文,进行回发,我们只需将从服务器爬虫下来的数据进行解析即可。解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。主要通过nowapi注册用户之后,进入相应的接口,进行抓取报文。次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提。构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提。③ 根据键值对的名称从链表中取出对应的值,返回该键值对(链。选择的模式,城市,fd,堆空间。
2024-09-04 22:58:09
3057
3
原创 双向链表基本知识
在销毁的时候,要需注意在此用的是头删,我们需要考虑,头删的结点,的下一个结点是否存在,也就是说特列是只有一个结点,如果不考虑会造成指针越界。1、两个指针,可以通过任意一个结点找到其前一个结点和后一个结点。2.1、创建一个双向链表。
2024-09-04 19:33:40
357
原创 嵌入式在线商城
1、设计与实现在线商城系统涉及到前端展示、后台管理以及数据库进行查找,功能包含登录页面、商品搜素、商品详细信息查找。主要用的是IO多路复用的epoll 进行设计,其资源消耗相对来说比较小,对于小型网页来说,完全够用,且效率高。第二步、接收监听队列里面的套接字,并产生通信的套接字。第一步、将创建好的套接字的文件描述添加到数组里面。第四步、对接收的报文需要的内容,进行发送。查到数据列数,地址集合,每一列列名的集合。第二步、遍历数组、查找当前的套接字。文件描述符,结构体指针,最大长度。至此三次握手建立完毕。
2024-09-03 23:33:40
778
原创 字典查找对应输入的字符
如果在未读满bufsize-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。或者已经读到size -1,这个时候注意,我们如果要读文件,读这个数据的时候,若已经放满了,则没有\0,会造出读的时候指针越界,因此在只读[sizeof - 1]。1、strlen()之后,得到的是有效字符的个数,那么如果我们想对\n去掉的话,那么必须是长度-1,因为我们数组是从0开始的。ferror(src)检查文件到底是否出错,注意,发生读的错误。
2024-08-29 20:55:17
470
原创 IO的多路复用
timeout:超时时间,等到了这个时间到了,就不在死等了,如果不设置超时时间,则设置为NULL。判断对应位有没有设置为1。2、添加文件描述符到集合中 int FD_ISSET(int fd, fd_set *set);4、内核返回的结果(两个结果,1、是那种类型得文件),做对应得操作(对IO读、写操作)
2024-08-28 20:53:02
1121
原创 TCP并发服务器
TCP实际上是单循环的服务器,只能建立一对一连接,其他人不能再与其建立连接,之前只有一个套接字。fgets,scanf,read,recv,getchar(用来实现多个IO同步的效果)UDP 是具备并发性的,是因为UDP是无连接的,所以处理器可以处理过来。1、增加异步属性 O_ASYNC(异步),O_SYNC(同步)实现:(当终端有输入的时候应该会触发,发射信号,才会执行)单循环服务器:同一时刻,只能处理一个客户端的任务。并发服务器:同一时刻,只能处理多个客户端的任务。2、关联信号和当前的进程。
2024-08-27 20:29:30
892
原创 常用网络测试工具以及解决tcp协议带来得问题
因为是文件IO,标准IO的问题,读写问题,因为fgets,先去底层取数据,我们把东西拿走了,而等文件IO,去取数据的时候东西已经没有了。这样我们就可以将文件描述符,转换成字符流指针,通过fgets来获取这些信息,再设置一个标志符,来进行区分所发送的信息。fgets()后面的参数需要一个流指针,后面是一个流指针,遇到\n结束,并且将\n读到。2、加延时,让先把东西发过去,间隔一下,相当于就是跑出去了,被拉了一下,两人错开了。字节流就是像水一样,一个接着一个往过流,字节流,紧挨着,
2024-08-23 19:06:11
1283
原创 TCP+UDP通信
一、UDP协议int sockfd, //socket 的fdvoid *buf, // 保存数据的一块空间的地址size_t len, //这块空间的大小int flags,// 0 默认的接收方式 -----阻塞方式 默认行为是阻塞struct sockaddr *src_addr,//用来保存发送方的地址信息,接收谁给发的表示发送方发送实际的地址信息大小注意 要是不关心是谁,我们addrlen或者大小写NULL。
2024-08-22 19:45:10
2018
原创 IPC进程通信以及网络通信
网络层 //tcp/ip 协议 栈(网络协议层)TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)socket // 1、一种特殊的文件----- 专门用于网络通信(不同主机间的进程)IP //用来标识网络中的一台主机 ----- 通过IP可以找到对应一台主机。//domain --域(范围)---socket 用于什么范围的通信。用户层 应用层 《--------- 程序员(应用层从传输层取数据)
2024-08-21 20:46:33
903
原创 管道与信号量
1、有名管道 特殊文件,但是在系统中有一个名字2、有名管道 可以用于 任意进程间通信3、有名通道 操作符号 前面管道操作特点4、管道中数据 遵循fifo 的读写规则5、管道文件都不支持定位操作 lseek fseek。
2024-08-17 19:39:26
1036
原创 信号量机制以及管道通信
1、信号量 -----来描述 可使用的资源的个数2、p操作 -----表示 使用这个资源 资源个数减一sem_t sem 定义的是一类资源(有几种资源,建立几个变量 )
2024-08-16 18:59:02
1107
原创 线程回收以及线程的问题处理
设置分离的状态,当一个分离的线程资源结束,他的资源自动被系统进行回收,不需要另一个线程等待回收,主线程也不需要关心子线程状态。1、pthread_join //需要自己回收 --- 线程的属性 (可结合性),阻塞,一般是子线程在较短时间内运行完。我们在做的过程中,可能还没有做完,发射了一个结束信号,线程没有结束返回的信息,故出现段错误。2、 //可分离属性 ------子线程运行很久结束 --- 设置分离属性,系统自动回收。此时执行逻辑,主线程执行流结束,进程会在其余线程都结束后,结束。
2024-08-15 19:34:37
1038
原创 进程的执行与结束
等待进程改变状态,在调用进程的子进程中,获得子进程改变状态改变的相关信息,进程结束、信号暂停、恢复。2)exit() //库函数 c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。//path代表运行的文件路径 ,第一个arg 固定代表文件的名字,后面跟着的参数可以写他的参数 int。1、任务-----子进程做的事情 和父进程差不多 //子承父业。exec函数族---------作用,启动(运行)一个新的程序。e ---- 你要传给就你要调用的程序,该程序所需要的创建变量。
2024-08-13 20:19:07
691
原创 多任务编程
/bss --未初始化的 全局变量 或 静态变量。堆/栈/bss/data/text ./a.out 之后就产生了堆栈,其他三个不消失。[静态区(全局区)] //data --已初始化的 全局变量 或 静态变量。进程: (占用 cpu ,内存相关的资源 ,IO资源(屏幕,键盘))data --- 初始化了的数据 | 静态区 | ---数据。data --- 初始化了的数据 | 静态区 | ---数据。bss --- 未初始化的数据 |bss --- 未初始化的数据 |
2024-08-12 19:18:54
948
原创 目录函数以及链接文件
MAKEFILE 编写 规则文件(事先写好一次)多个.c 编译Makefile 编写 工程管理工具vim 编辑器,gcc 编译器 ,gdb 调试器 (逻辑错误) make。
2024-08-08 18:45:08
997
原创 目录的读写
/777 666 --x--x--x (mode 给权限) 功能: 创建一个目录 666-权限给的是775,默认是775,但由于umask的值,和目录和文件的权限与其有关,将这个数减掉。判断权限 进行位运算,在其mode 里面由=有32位,低9位就是 实际上的权限位置,我们进行系统里面的宏运算,进行位运算,来判断其权限。参数: fd:已经打开的文件描述符 mode: "r" "r+" "w" "w+" "a" "a+"* info 代表目录的一项,目录里面有很多,要想拿多个,多次调用即可。
2024-08-07 18:32:55
1149
原创 标准IO的定位位置
可以通过fseek 偏移到最后,调用ftell ,返回一个从开始到最后的位置的大小。(把文件的大小)也就是可以返回从开头到postition的位置文件的大小。没有调错机制,那么缓冲的错误信息可能已经在时间上有偏差,所以系统设置了stderr,只要有报错,直接到屏幕,不需要刷新。若有create ,必须加权限,一般写0666,前面加0,因为是八进制,若没有则最后一个参数可以忽略不写。4、lseek 对其他三个的封装,实现其他三个的功能;本质就是一个数字,他不单单是一个数字,代表的是即将被处理的文件。
2024-08-06 19:47:32
689
原创 文件的读写
标准io (输入输出)站在计算机角度来确定输入输出,在linux里面io都是对文件操作。so 动态库函数(共享库),(公共的,用的很多),在user里面存储。size的数值尽可能和所开的空间一样,开的空间尽量比这一行长。操作文件被操作文件都存在,w 清零或者创建新文件。系统规定用-1表示,不是文件的内容,这是系统反馈的。与读操作一样,只是现在是从结构体中往文件里面写。2.6 fwrite() 写。man手册 manual。2.6 fread()读。1、打开文件,file。2、io操作,读写操作。
2024-08-05 19:12:02
517
原创 shell脚本
2."":打印字符串,遇到$变量则打印变量中的值 '':打印字符串,遇到$变量依然打印$变量 ``:将中间的字符串按照命令打印。3、chmod +x xx.sh chmod改变命令的权限chmod +x (x表示加上执行权限)echo 得空'$a' 单引原样输出,全部当作常量看,照着输出。1、环境变量 :env(系统级别变量,在任何环境下都能拿到)“ aaa,bbb,$a (如果有变量进行替换) ”f 条件(数字,字符串,判断文件的类型)4、./xx.sh (可执行文件)2、$a,读变量($相当于替换)
2024-08-03 21:45:08
1060
原创 链表和共用体
对已有起别名typedef int INT(从此以后INT不再是变量名而是类型名)。位运算(所有位运算要操作数的类型是与整形或者整形兼容,或者枚举也可以;但是指针,结构体这些都不可以,不与整形兼容)按位与是指定位清0按位或| 指定位置1按位异或^,指定位反转取反 单目运算 对所有的数取反
2024-08-02 18:13:08
575
原创 结构体与链表
任意由程序员创建出来的新类型struct Student (类项名)s(变量名)s. (结构体运算符)注意s 在栈区;struct student 在全局stuct{ } s1,s1;也可以这样声明变量s1,s2,;同时省略结构体名,以后只能用s1,s2,来实现。
2024-08-01 17:40:27
781
原创 多维数组与指针
a[0]、a[1]、a[2]既然是一维数组名,而C语言又规定了数组名代表数组首元素地址,因此a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0]。a[1]的值是&a[1][0],a[2]的值是 &a[2][0]。因为a 是一行的地址,整个一行,对一行取*,意味着从一行里面取出第一个元素的,第一个元素a[],那么也就等于在二维数组&a【】【】的地址,所以是int *int *p[10] 指针数组(里面装的都是指针,10个指针),sizeof(p)就为80,因为指针在里面的长度为8。
2024-07-31 19:01:39
788
原创 指针第二部分
通过变量名无法直接访问,虽然不能直接访问,但是我们可以通过指针间接的访问来对其进行修改。strncpy本质上是将另一个拷贝到另一个,只是多传了一个参数,根据参数来进行选择拷贝的个数。这个n 代表的是字节数,不是元素的个数。strncpy本质上是将另一个拷贝到另一个,只是多传了一个参数,根据参数来进行选择拷贝的个数。局部变量不建议使用,是因为,局部变量在创建的时候,用完也销毁,最好所指向的空间是一个野指针。指针指向的东西能不能进行修改。Strncmp()函数注意实现的,比较大小,但是可以选择要比较的个数。
2024-07-30 19:36:33
917
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人