- 博客(49)
- 收藏
- 关注
原创 指针传参误区
野指针不会有这个问题,因为野指针会被随机的分配一块内存空间,但是实际使用中仍不建议这样使用,使用野指针操作,可能会踩到其他内存空间造成莫名其妙的死机,并且很难排插问题。同样的若是要修改指针a的内容,如果a为空指针在函数内调用。这种形式的话,是无法通过简单的。C语言中指针作为形参传递时,形式2:采用二级指针的形式,
2024-01-08 21:40:57
402
原创 快速排序法
1选定Pivot中心轴(为了方便通常选取最开始的数据为中心轴)4.分别对左右子序列重复前三步操作(递归操作)2将大于Pivot的数字放在Pivot的右边。3将小于Pivot的数字放在Pivot的左边。
2023-02-17 23:01:08
300
原创 内存常见划分区域ZI-data RO-data RW-data Code BSS DATA
RO_DATA段:只读(read_only)区域,保存const修饰的常量,不是全部的常量都保存再这的,有的立即数直接编码在指令里,存放在代码段(.text)中,BSS段(好像和ZI-data是一样的):保存未初始化或初始化为0的全局变量,这种全局变量再bss段里面都会被清成0,为了移植方便最好都初始化成0。在有的嵌入式系统中,rodata放在ROM(如norflash)里,运行时直接读取ROM内存,无需要加载到RAM内存中。RW-data: 可读可写的,已经初始化的全局变量。
2022-12-30 16:12:17
606
原创 fatfs
ffconf,h如何配置在点进api后也都可以看到。文件地址下载地址在这上上面。api在这都有很详细的介绍。具体的看代码MYfatfs。这边一部分需要自己实现。
2022-07-25 22:05:20
95
原创 FreeRtos——错误排查
printf-stdarg.c当调用标准 C 库函数时,栈空间使用量可能会急剧上升,特别是 IO 与字符串处理函数,比如sprintf()。在 FreeRTOS 下载包中有一个名为 printf-stdarg.c 的文件。这个文件实现了一个栈效率优化版的小型 sprintf(),可以用来代替标准 C 库函数版本。在大多数情况下,这样做可以使得调用 sprintf()及相关函数的任务对栈空间的需求量小很多。printf-stdarg.c 源代码开放,但是为第三方所有。所以此源代码的 license 独立于
2021-11-28 15:47:19
1292
原创 FreeRtos_内存管理
内存管理每当任务,队列或是信号量被创建时,内核需要进行动态内存分配。虽然可以调用标准的 malloc()与 free()库函数,但必须承担以下若干问题:这两个函数在小型嵌入式系统中可能不可用。这两个函数的具体实现可能会相对较大,会占用较多宝贵的代码空间。这两个函数通常不具备线程安全特性。这两个函数具有不确定性。每次调用时的时间开销都可能不同。这两个函数会产生内存碎片。这两个函数会使得链接器配置得复杂不同的嵌入式系统具有不同的内存配置和时间要求。所以单一的内存分配算法只可能适合部分应用程序。
2021-11-22 13:38:41
336
原创 FreeRTOS--资源管理
函数重入如果一个函数可以安全地被多个任务调用,或是在任务与中断中均可调用,则这个函数是可重入的。每个任务都单独维护自己的栈空间及其自身在的内存寄存器组中的值。如果一个函数除了访问自己栈空间上分配的数据或是内核寄存器中的数据外,不会访问其它任何数据,则这个函数就是可重入的。可重入的函数:```css/* 一个参数被传递到函数中。要么是传递到堆栈或在CPU寄存器中。 两种方法都是安全的 每个任务维护自己的堆栈和自己的寄存器集值。 */ long lAddOneHundered( long l
2021-11-18 13:51:30
912
原创 FreeRtos--中断
采用二值信号量同步二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR)中只是快速处理少部份工作。如此,中断处理可以说是被”推迟(deferred)”到一个”处理handler)”任务。延迟处理任务对一个信号量进行带阻塞性质的”take”调用,意思是进入阻塞态以等待事件发生。当事件发生后,ISR 对同一个信号量进行”give”操作,使得延迟处理任务解除阻塞,从而事件在延迟处理任务中得到相应的处理。“获取(
2021-11-16 17:09:43
5504
原创 FreeRtos--队列
基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的小程序。这些独立的任务之间很可能会通过相互通信以提供有用的系统功能。FreeRTOS 中所有的通信与同步机制都是基于队列实现的。通常情况下,队列被作为 FIFO(先进先出)使用,即数据由队列尾写入,从队列首读出。当然,由队列首写入也是可能的。往队列写入数据是通过字节拷贝把数据复制存储到队列中;从队列读出数据使得把队列中的数据拷贝删除。...
2021-11-15 19:41:32
851
原创 FreeRtos_任务管理学习记录
在 FreeRTOS 中,每个执行线程都被称为”任务”。在嵌入式社区中,对此并没有一个公允的术语,但我更喜欢用”任务”而不是”线程”,因为从以前的经验来看,线程具有更多的特定含义。任务函数任务是由 C 语言函数实现的。唯一特别的只是任务的函数原型,其必须返回 void,而且带有一个 void 指针参数。其函数原型参见程序清单 1。void ATaskFunction( void *pvParameters );//这个东西就相当于c语言的函数,这个名字是可以自己定义的每个任务都是在自己权限范
2021-11-10 21:06:17
579
转载 安装git之后的配置
1.配置用户名和邮箱git config --global user.name "你的名字"git config --global user.email "你的邮箱"
2021-10-17 17:29:18
690
1
原创 如何配置linux环境变量
然后开始配置环境变量,不然每次编译都得有进入该目录非常麻烦,有两种方法,建议使用第二种一劳永逸临时有效,配置环境变量PATH 环境变量export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin(需要改成自己的环境变
2021-09-29 10:41:38
223
原创 STM32 输入输出模式
输入模式1.浮空输入2.上拉输入上拉电阻:把不确定的信号通过电阻连接到高电平电信号初始化为高电平3.下拉输入下拉电阻:把不确定的信号通过电阻连接到低电平电信号初始化为低电平4.模拟输入输出模式1.开漏输出2.推挽输出3.推挽复用输出4.开漏复用输出...
2021-07-26 15:30:42
181
转载 socket,tcp,http三者之间的区别和原理
http、TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置:7 应用层 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP6 表示层 例如XDR、ASN.1、SMB、AFP、NCP5 会话层 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD socke
2021-07-15 11:08:52
171
原创 使用动态库的技巧
当我们编译是出现这个问题的时候是因为找不到头文件我们需要使用这个链到头文件的位置gcc demo1.c -I ./curl-7.71.1/_install/include/这个位置需要根据库的位置具体设置这边的 -I表示的是从./curl-7.71.1/_install/include/这个地方去找头文件,.表示从当前路径下去找,如果不是在当前路径下去找到话可以使用pwd查看头文件的位置当出现这个错误的时候这个错误表示找不到库的位置我们需要执行这个来找库的位置gcc demo1.c -I.
2021-05-08 17:11:35
105
原创 简单工厂模式
1.什么是设计模式代码设计经验的总结,使代码更加稳定,扩展性更强,这样一系列的编程思想。设计模式通常描述了一组项目紧密作用的类与对象。(JAVA)设计模式一共有23种,具体可在这个链接中进行学习:https://www.runoob.com/design-pattern/design-pattern-tutorial.html引入设计模式可以使代码更容易被他人理解,保证代码的可靠性,程序的重用性。C——面向过程 也是一门不太友好的面向对象语言JAVA——面向对象2.什么是类和对象类:是一种
2021-04-17 16:38:11
93
原创 liunx内核驱动--IO操控代码编程
要编写对io口进行操控,我们首先需要去阅读芯片手册,这边使用的是树莓派 3B所以查看的手册是BCM2835,查看cpu型号可以用这个指令来查看:cat /proc/cpuinfogipo引脚介绍(只介绍这边使用到的)底层代码pin4driver.c#include <linux/fs.h>#include <linux/module.h>#include <linux/init.h>#include <linux/device.h>#i
2021-04-13 16:43:40
211
原创 微机总线地址物理地址虚拟地址介绍
总线地址:cpu能够访问的范围现象: 装了32位的win7系统,内存条有8G可是系统只能识别3.8G,只有装了64位的才能识别8G原因是:32位表示只能访问2的32次方即4,294,967,296bit的数据约等于物理地址:硬件的实际地址或者绝对地址虚拟地址:逻辑(基于算法的地址,也就是软件层面的地址,假地址)地址...
2021-04-11 16:27:22
107
原创 linux内核第一次编程
sudo insmod pin4driver.ko 表示将pin4加载到内核中卸载为:sudo rmmod pin4driver.ko666 表示所有用户均可读写的权限
2021-04-11 14:31:18
104
原创 Liunx系统编程之线程
#include<pthread.h>//头文件进程——资源分配的最小单位,线程——程序执行的最小单位多线程开发在 Linux 平台上已经有成熟的 pthread 库支持。其涉及的多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。条件操作有 5 种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。详细请见下表:
2021-04-03 20:34:39
114
原创 Linux 驱动认知
Linux——一切皆文件:这边的文件不仅仅是我们常规理解的文件,也包括了:鼠标,键盘,屏幕,led,flash,内存,网卡…(在/dev/中可看出来)驱动:在内核中有一个驱动链表用来管理所有的设备驱动(驱动插入到链表的顺序是由设备号检索)功能:1.添加:编写完的驱动程序加载到内核2.查找:调用驱动程序————由用户空间去open对文件操作可以用到函数:1open(); 2read();3wirte();如何区分我们打开的是哪个驱动?ex:fd=open("/dev/pin4",O_RD
2021-03-26 17:53:53
103
转载 Linux内核结构 shell介绍
shell是一个特殊的应用。通常被称为命令行 。shell是一个命令解释器(interpreter),例如当我们输入“ls -l”的时候,它将此字符串解释为1.在默认路径找到该文件(/bin/ls),2.执行该文件,并附带参数"-l"。一个shell对应一个终端 (terminal)。曾经来说,终端是一个硬件设备,用来输入并显示输出。如今,由于图形化界面的普及,终端往往就像上图一样,是一个图形化的窗口。你可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,然后执行。原文链..
2021-03-26 15:24:04
339
转载 Linux虚拟文件系统
什么虚拟文件系统Virtual File System ?vfs就是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口,虚拟文件系统有什么作用?1.简化应用程序员的开发2.不管是什么文件类型,不管文件是磁盘还是设备,都只用open read write统一操作这篇文章有详细介绍:原文链接:https://blog.csdn.net/weixin_36145588/article/details/73607463...
2021-03-26 14:18:24
101
原创 Linux文件系统
什么是文件系统常规认知: 根目录文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控
2021-03-26 13:37:11
284
原创 树莓派Linux源码配置和内核编译
1. 树莓派Linux源码配置a.驱动代码的编写b.驱动代码的编译需要一个提前编译好的内核c.编译内核就必须配置d.配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码第一种方式: cp 厂家.config .config第二种方式:make menuconfig 一项项配置,通常是基于厂家的config来配置第三种方式:完全自己来如何配置树莓派的Linux内核驱动两种加载方式:
2021-03-24 16:59:21
572
3
转载 Could not get lock /var/lib/dpkg/lock-frontend--解决办法
使用apt安装时报错:E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?解决方案:方案一:sudo killall apt apt-get如果提示没有
2021-03-24 14:01:25
723
转载 树莓派wiringPi库详解
wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。java 的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了会放出来的。下面开始wiringPi之旅吧!原文地址:https://www.cnblogs.com/lulipro/p/5992172.html...
2021-03-23 22:56:57
207
原创 树莓派Linux源码目录树分析
linux内核大约1.3w个C文件 1100w行代码Linux是开源的,免费的,由LInux开源社区工作者共同维护Linux是一个开源的,支持多架构多平台代码可移植性非常高但是Linux内核编译出来一般就几M. 4M因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用{ARM架构:海思 友善之臂 RK 树莓派 nanoPiX86架构PowerPC架构MIPS架构}linux内核目录存放了哪些信息在这篇文章内有详细介绍:https://www.cnblog
2021-03-22 16:55:04
134
原创 Ubuntu Linux无法被连接--解决办法
Ubuntu Linux无法被连接—是因为没有开启ssh服务,sudo apt install openssh-server
2021-03-22 14:09:33
367
转载 E: Could not get lock /var/cache/apt/archives/lock - open (11: Resource temporarily unavailable)解决办法
在ubuntu系统中使用apt-get安装软件包时,会出现以下错误:E: Could not get lock /var/cache/apt/archives/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/cache/apt/archives/解决办法:sudo rm -rf /var/cache/apt/archives/locksudo apt-get update————
2021-03-22 14:03:00
1882
原创 liunx共享文件突然无法使用--解决办法
执行这个指令:sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid=1000如何进入/mnt/hgfs/看看 cd /mnt/hgfs/
2021-03-21 18:25:52
170
原创 liunx分文件编程,静态库,动态库的引入
分文件编程的好处:a.功能责任划分b.方便调试c.主程序简洁在这里用一个简单的计算机程序来示例首先我们将计算机的主程序math.c编写好#include<stdio.h>//<>默认会优先从 /usr/inclued/去寻找头文件#include"mathfun.h"//使用双引号表示优先从当前路径去寻找这个头文件int main(){ int a; int b; int ret; float ret2; printf("请输入第一个加数\n"); s
2021-03-21 15:44:24
99
原创 ftp阅读笔记
服务端:sever.cint main(){ msg_handler(msg,c_fd);//指令处理函数,对ls,pwd等指令的处理 get_cmd_type(char *cmd)//判断客户端发送的指令是什么 strcmp()字符串比较函数 strstr(cmd,"cd")在字符串 cmd中查找第一次出现字符串 cd的位置,若出现了则为真 getDisDir(msg.cmd)//分隔字符串 char *p; p = strtok(csmg," ");//以空
2021-03-20 17:47:06
76
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人