自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C语言反转链表,10行代码

1

2021-12-20 16:28:56 260

原创 QSPI DSPI SPI超级详细的讲解,友好的讲解。

外扩的flash接口一般都是SPI(与片上flash不一样,片上flash理解为在已经集成在芯片内部了,集成在芯片内部的flash就一般不存在SPI接口说法了,都是通过总线进行数据的交换。而外扩的flash是理解为硬盘就可以了)。因此外扩的flash一般也说是spi-flash。SPI是什么?网上说SPI DSPI QSPI有几根数据线什么,对新手来说谁特么听的懂啊。直接不多说,上图讲解:GD25Q16BS为一款FLASH,这个不重要,重要的是接口的8根线。下面逐一讲解:CS:片选信号,这个不用

2021-12-10 10:46:55 12014 3

原创 基于兆易创新GD32F450IK芯片的流水灯程序,详解,对入门童鞋友好的讲解

介绍: 采用的芯片是GD32F450IK,芯片厂商为兆易创新,开发板是厂商寄过来的。采用的是keil5.25.代码例程是在兆易创新官网下载的,链接如下。http://gd32mcu.com/cn/download/0?kw=GD32F4代码例程图片如下:不多说,直接上代码讲解。int main(void){ /* configure systick */ systick_config(); /* enable the LEDs GPIO clock */

2021-12-07 15:53:51 2221 2

原创 基于GD32F450芯片的IIC读写EEPROM详解,写篇

本文采用的是GD32F450芯片,基于此芯片的官网例程来对IIC读写EEPROM进行详解。对于初学者来说,感觉IIC很复杂,时许逻辑很绕,无从下手。感觉很多概念不理解,但是不要慌,此文给你详解。上来不多说,直接贴代码!void eeprom_page_write(uint8_t* p_buffer, uint8_t write_address, uint8_t number_of_byte){ /* wait until I2C bus is idle */ while(i2c_fl

2021-12-02 15:00:20 4287 3

原创 Linux 服务器和客户端socket通信,网络通信,详解

服务器端工作流程:调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址和端口绑定调用listen()函数监听socket() 函数创建的套接字,等待客户端连接 当客户端请求到来之后调用 accept()函数接受连接请求,返回一个对应于此连接的新的套接字,做好通信准备调用 write()/read() 函数和 send()/recv()函数进行数据的读写,通过 accept() 返回的套接字和客户端进行通信 关闭socket(close)客户端工作流.

2021-11-17 10:23:16 3101

原创 linux 信号量,条件量,详解

线程的知识点太多,太重要,所以分成三部分进行总结学习线程安全多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。多个线程对临界资源进行竞争操作时若不会造成数据二义性时则线程安全;否则,此时就是不安全的如何实现线程安全常见的线程安全的情况每个线程对全局变量或者静态变量只有读取的权限,而没有写入的权限,一般来说这些线程是安全的类或者接口对于线程来说都是原子操作多个线程之间的切换不会导致该接口的执行结果存在二义性常见的线程不安全

2021-11-16 15:26:13 253

原创 Linux 哲学家吃面,详细分析;

一、问题介绍哲学家进餐问题是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有一碗面和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。如下图所示:2、解决办法多线程版思路:选用互斥锁mutex,如创建5个, pthread_mutex_t m[5];模型抽象:5个哲学家 --> 5个线程; 5支筷子 --> 5把互斥

2021-11-16 14:49:42 143

原创 Linux 线程,创建,分离,回收详解

并行和并发的区别并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。(并发是指同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上有多个进程被同时执行的效果–宏观上并行,针对单核处理器)互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。同步(synchronous):进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程

2021-11-16 11:00:07 305

原创 堆栈地址的生长方向,以及一些思考

如何判断栈的增长方向?对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的问题,因为栈就是从高地址向低地址增长。不过,显然这不是这个问题的目的,既然把这个问题拿出来,问的就不只是i386系列的机器,跨硬件平台是这个问题的首先要考虑到的因素。在一个物质极大丰富的年代,除非无路可退,否则我们坚决不会使用汇编去解决问题,而对于这种有系统编程味道的问题,C是一个不错的选择。那接下来的问题就是如何用C去解决这个问题。C在哪里会用到栈呢?稍微了解一点C的人都会立刻给出答案,没错,函数。我们知道,局部变量都存

2021-11-01 15:59:56 2852

原创 STM32 HAL库串口回调机制详解

在开始学习STM32的时候,会发现,怎么有个串口中断回调和串口中断不一样的概念啊,感觉很头晕,找了很久也没发现到底区别在哪儿,回调机制是怎么实现的。下面就详解一下:通过STM32CubeMx配置工程,生成代码,这一步就不操作了,读者自己熟悉吧。在stm32h7xx_it.c保存着所有外设的中断入口函数,我们需要在这里添加UART2的重点函数。函数不需要声明,HAL库已经声明过了。所以当中断发生后,程序会通过USART2_IRQHandler函数进入到HAL_UART_IRQHandler中断处理函数。

2021-10-29 15:55:56 11333 5

原创 STM32 FDCAN通信,发射部分详解。

前言在CAN专属的消息RAM中,存在32个TX缓冲区,32个TX事件FIFO。每个里面都存在1个元素,一共有64个元素,对应64个报文。TX缓冲区每一个TX缓冲区可以配置一个ID,即对应一个报文。缓冲区内不仅仅只有报文的内容,还有报文的类型、ID等相关信息,官方定义这样一个整体叫element,叫元素。下面是每个元素都有什么内容。(1) 位 ESI:当检测到错误时是否将发送错误标志。(2) 位 XTD:决定接受 ID 的位数是 11 位还是 29 位。1 表示 29 位扩展格式的 ID,0 表

2021-10-29 14:06:22 3723

原创 STM32 ADC的连续,扫描模式的含义

ADC单通道:要求进行一次ADC转换:配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换。要求进行连续ADC转换:配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。ADC多通道:必须是扫描模式要求进行一次ADC转换:配置为单次模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。要求进行连续ADC转换:配置为连续模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,接

2021-10-18 16:46:02 1344

原创 C语言typedef函数指针用法

1.简单的函数指针的应用形式1:返回类型(*函数名)(参数表)char (*pFun)(int);char glFun(int a){ return;}void main(){pFun = glFun;(*pFun)(2);} 第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。 第二行定义了一个函数glFun()。

2021-10-13 09:54:45 2009

原创 基于STM32的freertos实时系统,双线程参考实例

上回说到我的任务1不见了,只有任务2,这次要找它出来!上篇链接:https://blog.csdn.net/a_happy_ant/article/details/120719576?spm=1001.2014.3001.5501找出来的方式有很多种,先说说抢占式调度(CubeMx默认设置是这个)一、抢占式调度还是先来看看osThreadDef的定义:上一章我们大概清楚了第一个参数 name 的作用,os_thread_def_##name 是声明了一个变量,#name是把这么宏参数变为字符串,

2021-10-12 11:17:25 1009 1

原创 STM32CubeMx移植freertos系统,简单的双线程工作

对于初学者,只需要知其然就可以,不需要深究底层逻辑。等用熟了,有些概念了,再来深究会好很多。使用CubeMx 移植FreeRTOS,比较简单。一、新建工程只需要把这里勾上就OK了,其它都是常规配置,记得把时钟配置上,我这里添加了一个串口,用于测试演示,LED都懒得配置了。(不同版本的cubemx界面可能有些不同,这里不一一展示,直接添加freertos,软件版本选择cmsis v1即可)直接点击生成,发现有警告:是说FreeRTOS和HAL库的时钟源由冲突,然后强烈建议我们把时钟源改为其它的,既

2021-10-12 11:12:41 1299

原创 C语言 指针函数与函数指针详解

前言函数指针和指针函数,先来看看两者的定义以及说明。指针函数定义指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式为:*类型标识符 函数名(参数表)看看下面这个函数声明:int fun(int x,int y);这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。接着看下面这个函数声明:int fun(int x,int y);这和上面那个函数唯一的区别就是在函数名前面多了一个号,而这个函数就是一个指针函

2021-09-18 11:55:32 506

原创 C语言strlen与sizeof的区别详解

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:size_t strlen(char const* str);也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:char sArr[] = “ILOVEC”;/用strlen()求长度/printf(“sArr的长度=%d\n”, strlen(sArr));很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。这里需

2021-09-17 16:46:58 166

原创 I2C时序

I2C时序理解欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo

2021-09-10 10:48:21 6319

原创 C语言中的逻辑移位和算术移位

c语言中的移位操作符,在**左移时执行的是逻辑移位,在右移时执行的是算术移位。**那怎么用>>实现右移操作呢?又经过查证得知,无符号数的移位操作都是执行的逻辑移位。那么要想用>>实现逻辑右移就可以将操作数强制类型转化为unsigned类型,如下:int a = 0xfffffffe;int b = (unsigned int)a >> 1;执行的结果是2147483647即0x7fffffff,可见其右移后左端补的是0。综上:C语言中移位操作符实现的是逻辑左移和

2020-05-30 13:27:48 2793 3

原创 C语言const限定详解

const 和指针const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序,如下所示:const int *p1;int const *p2;int * const p3;在最后一种情况下,指针是只读的,也就是 p3 本身的值不能被修改,意思是p3只能指向一个固定的地址,但是地址里面的值不能修改;在前面两种情况下,指针所指向的数据是只读的,也就是 p1、p2 本身的值可以修改(指向不同的地址),但它们指向的数据不能被修改

2020-05-09 16:24:44 300

原创 C语言常用的一些库函数

一、数学函数调用数学函数时,要求在源文件中包下以下命令行:#include <math.h>函数原型说明功能返回值说明int abs( int x)求整数x的绝对值计算结果double fabs(double x)求双精度实数x的绝对值计算结果double acos(double x)计算cos-1(x)的值计算结果x在-1~1范围内double asin(double x)计算sin-1(x)的值计算结果x在-1~1范围内double atan(dou

2020-05-09 14:26:56 181

原创 c字节对齐相关

一、字节对齐基本概念    现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须

2020-05-08 17:33:21 107

原创 C语音实现通用数据结构---通用集合(hashset)

详情请参考一下链接:https://blog.csdn.net/swwlqw/article/details/22498833

2020-04-30 21:12:50 148

原创 c语言static静态变量详解

c语言static变量详解详情请见详情请见https://www.cnblogs.com/heyonggang/p/3198431.html

2020-02-07 10:58:16 137

原创 Linux下setitimer的使用

说白了,就是it_value对应的是第一次定时的间隔,就是定时器被设置完毕后,过it_value的时间之后,会有一个信号过来,之后再过it_interval的时间才会有信号过来。如果it_interval值为0,即只定时一次。详情请见以下链接:https://blog.csdn.net/lixianlin/article/details/25604779...

2019-12-03 14:53:34 118

原创 内核编译中出现的Unable to find the ncurses libraries or the required header files解决

详情请咨询:https://blog.csdn.net/chenbang110/article/details/7794989

2019-11-29 15:28:11 300

原创 Linux sigwait使用心得

详情请参考以下链接:https://blog.csdn.net/haohenghai/article/details/16948915

2019-11-27 09:13:17 167

原创 嵌入式面试总结

详情请参考:https://blog.csdn.net/qq_36260510/article/details/81513798https://blog.csdn.net/mao_hui_fei/article/details/82710536

2019-11-15 16:59:03 82

原创 Linux下利用信号的异步串口中断响应,就是fcntl,sigaction等的一些思考

详情请见:https://www.xuebuyuan.com/839268.htmlhttps://bbs.csdn.net/topics/392292366?list=22321564

2019-11-15 09:40:29 214

原创 C语言字符串比较strcmp,strcmpi等函数的介绍

详情请见:https://blog.csdn.net/Ctrl_qun/article/details/66970652

2019-11-15 09:00:27 452

原创 strtol函数,将字符串转换为进制数

详情请咨询:https://blog.csdn.net/wsclinux/article/details/50771430

2019-11-12 16:33:57 165

转载 文件映射mmap简单设置文件大小,分别对两个文件创建映射区,然后对映射区操作,进行通信

https://blog.csdn.net/fdsafwagdagadg6576/article/details/46682495

2019-11-12 09:35:58 304

原创 Linux线程信号

概念按照 POSIX, 异步 (外部) 信号发送到整个进程.所有线程共享同一个设置, 即通过 sigaction 设置的线程处置方法.每个线程有自己的信号掩码, 线程库根据该掩码决定将信号发送到哪个线程.由于Linux 线程实现上的独特性, 外部信号始终发送到特定的线程.详情请见:https://blog.csdn.net/fuyuande/article/details/8392...

2019-10-30 18:08:15 96

原创 linux中sleep函数的使用和总结

在linux编程中,有时候会用到定时功能,常见的是用sleep(time)函数来睡眠time秒;但是这个函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执行该进程的时候,该进程会从sleep函数的下一条语句执行;这样的话就不会睡眠time秒了;头文件: #include <unistd.h>函数:unsigned int sleep (unsign...

2019-10-30 15:30:04 405

空空如也

空空如也

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

TA关注的人

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