
C语言
文章平均质量分 80
a_happy_ant
这个作者很懒,什么都没留下…
展开
-
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 · 14455 阅读 · 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 · 2441 阅读 · 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 · 4678 阅读 · 3 评论 -
linux 信号量,条件量,详解
线程的知识点太多,太重要,所以分成三部分进行总结学习线程安全多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。多个线程对临界资源进行竞争操作时若不会造成数据二义性时则线程安全;否则,此时就是不安全的如何实现线程安全常见的线程安全的情况每个线程对全局变量或者静态变量只有读取的权限,而没有写入的权限,一般来说这些线程是安全的类或者接口对于线程来说都是原子操作多个线程之间的切换不会导致该接口的执行结果存在二义性常见的线程不安全原创 2021-11-16 15:26:13 · 323 阅读 · 0 评论 -
Linux 哲学家吃面,详细分析;
一、问题介绍哲学家进餐问题是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有一碗面和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。如下图所示:2、解决办法多线程版思路:选用互斥锁mutex,如创建5个, pthread_mutex_t m[5];模型抽象:5个哲学家 --> 5个线程; 5支筷子 --> 5把互斥原创 2021-11-16 14:49:42 · 200 阅读 · 0 评论 -
Linux 线程,创建,分离,回收详解
并行和并发的区别并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。(并发是指同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上有多个进程被同时执行的效果–宏观上并行,针对单核处理器)互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。同步(synchronous):进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程原创 2021-11-16 11:00:07 · 384 阅读 · 0 评论 -
strtol函数,将字符串转换为进制数
详情请咨询:https://blog.youkuaiyun.com/wsclinux/article/details/50771430原创 2019-11-12 16:33:57 · 210 阅读 · 0 评论 -
堆栈地址的生长方向,以及一些思考
如何判断栈的增长方向?对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的问题,因为栈就是从高地址向低地址增长。不过,显然这不是这个问题的目的,既然把这个问题拿出来,问的就不只是i386系列的机器,跨硬件平台是这个问题的首先要考虑到的因素。在一个物质极大丰富的年代,除非无路可退,否则我们坚决不会使用汇编去解决问题,而对于这种有系统编程味道的问题,C是一个不错的选择。那接下来的问题就是如何用C去解决这个问题。C在哪里会用到栈呢?稍微了解一点C的人都会立刻给出答案,没错,函数。我们知道,局部变量都存原创 2021-11-01 15:59:56 · 3005 阅读 · 0 评论 -
STM32 HAL库串口回调机制详解
在开始学习STM32的时候,会发现,怎么有个串口中断回调和串口中断不一样的概念啊,感觉很头晕,找了很久也没发现到底区别在哪儿,回调机制是怎么实现的。下面就详解一下:通过STM32CubeMx配置工程,生成代码,这一步就不操作了,读者自己熟悉吧。在stm32h7xx_it.c保存着所有外设的中断入口函数,我们需要在这里添加UART2的重点函数。函数不需要声明,HAL库已经声明过了。所以当中断发生后,程序会通过USART2_IRQHandler函数进入到HAL_UART_IRQHandler中断处理函数。原创 2021-10-29 15:55:56 · 12496 阅读 · 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 · 4295 阅读 · 0 评论 -
STM32 ADC的连续,扫描模式的含义
ADC单通道:要求进行一次ADC转换:配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换。要求进行连续ADC转换:配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。ADC多通道:必须是扫描模式要求进行一次ADC转换:配置为单次模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。要求进行连续ADC转换:配置为连续模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,接原创 2021-10-18 16:46:02 · 1672 阅读 · 0 评论 -
基于STM32的freertos实时系统,双线程参考实例
上回说到我的任务1不见了,只有任务2,这次要找它出来!上篇链接:https://blog.youkuaiyun.com/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 · 1145 阅读 · 1 评论 -
STM32CubeMx移植freertos系统,简单的双线程工作
对于初学者,只需要知其然就可以,不需要深究底层逻辑。等用熟了,有些概念了,再来深究会好很多。使用CubeMx 移植FreeRTOS,比较简单。一、新建工程只需要把这里勾上就OK了,其它都是常规配置,记得把时钟配置上,我这里添加了一个串口,用于测试演示,LED都懒得配置了。(不同版本的cubemx界面可能有些不同,这里不一一展示,直接添加freertos,软件版本选择cmsis v1即可)直接点击生成,发现有警告:是说FreeRTOS和HAL库的时钟源由冲突,然后强烈建议我们把时钟源改为其它的,既原创 2021-10-12 11:12:41 · 1458 阅读 · 0 评论 -
C语言 指针函数与函数指针详解
前言函数指针和指针函数,先来看看两者的定义以及说明。指针函数定义指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式为:*类型标识符 函数名(参数表)看看下面这个函数声明:int fun(int x,int y);这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。接着看下面这个函数声明:int fun(int x,int y);这和上面那个函数唯一的区别就是在函数名前面多了一个号,而这个函数就是一个指针函原创 2021-09-18 11:55:32 · 611 阅读 · 0 评论 -
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 · 215 阅读 · 0 评论 -
I2C时序
I2C时序理解欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo原创 2021-09-10 10:48:21 · 6777 阅读 · 0 评论 -
C语言中的逻辑移位和算术移位
c语言中的移位操作符,在**左移时执行的是逻辑移位,在右移时执行的是算术移位。**那怎么用>>实现右移操作呢?又经过查证得知,无符号数的移位操作都是执行的逻辑移位。那么要想用>>实现逻辑右移就可以将操作数强制类型转化为unsigned类型,如下:int a = 0xfffffffe;int b = (unsigned int)a >> 1;执行的结果是2147483647即0x7fffffff,可见其右移后左端补的是0。综上:C语言中移位操作符实现的是逻辑左移和原创 2020-05-30 13:27:48 · 3176 阅读 · 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 · 367 阅读 · 0 评论 -
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 · 211 阅读 · 0 评论 -
c字节对齐相关
一、字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须原创 2020-05-08 17:33:21 · 136 阅读 · 0 评论