- 博客(29)
- 资源 (4)
- 收藏
- 关注
原创 【GD32】GD32F105XX时钟系统分析及时钟配置
1. 系统框图HXTAL:高速外部时钟;LXTAL:低速外部时钟;IRC8M:高速内部时钟;IRC40K:低速内部时钟;2. 时钟树/*! \brief get the system clock, bus and peripheral clock frequency \param[in] clock: the clock frequency which to get only one parameter can be selecte
2022-01-19 11:57:16
3617
1
原创 volatile变量的概念及用法
一、voltaile关键字volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。二、编译器优化的概念int i = 5;int a = i;……int b = i;编译器发现两次从i读数据的代码之间,并没有对i...
2019-09-03 15:05:36
2396
原创 数据结构的堆栈与内存分配中的堆栈
一、数据结构的堆栈首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。堆和栈都是一种数据项按序排列的数据结构。栈就像装数据的桶或箱子我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。...
2019-07-26 16:35:43
958
原创 数据字节类型的长度与结构体字节对齐
一、数据字节类型的长度在32位机器和64机器中int类型都占用4个字节。编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节(例如,GCC)。下面...
2019-07-26 09:50:38
960
原创 六、Linux系统IO编程—fcntl 函数 和 ioctl 函数详解
一、fcntl()函数1. 函数的原型#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock * lock);函数说明:fcntl...
2019-07-24 09:19:43
1369
原创 五、Linux系统IO编程—dup与dup2函数
一、cat输入输出的重定向1. cat命令cat 命令用于连接文件并打印到标准输出设备上。语法格式cat [-AbeEnstTuv] [–help] [–version] fileName参数说明:-n 或 --number:由 1 开始对所有输出的行数编号。-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。-s 或 --sq...
2019-07-18 19:16:28
310
原创 四、Linux系统IO编程—文件IO的内核数据结构与文件原子操作
一、缓存buff说明一般设置缓存 buff 的大小是有一定的规律的,就是根据磁盘块的大小来定。Linux下输入命令: df -k 查看磁盘 可以用命令查看下 /dev/sda1 磁盘的磁盘说明sudo tune2fs -l /dev/sda1Block size 就是磁盘块的大小,这个磁盘块的大小为 4M ,那么就可以设置缓存 buff 大小为 4096,一次就可以将数据写入。...
2019-07-17 16:33:39
253
原创 三、Linux系统IO编程—系统调用文件IO
一、文件IO的概念文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。文件I/O 又称为低级磁盘I/O,遵循POSIX相关标准。任何兼容POSIX标准的操作系统上都支持文件I/O。标准I/O被称为高级磁盘I/O,遵循...
2019-07-04 11:06:21
475
原创 二、Linux系统IO编程—系统调用标准IO
一、标准IO概念标准IO在系统调用的上一层多加了一个缓冲区,也因此引入了流的概念,在UNIX/Linux下表示为FILE*(并不限于UNIX/Linux,ANSI C都有FILE的概念),FILE实际上包含了为管理流所需要的所有信息:实际I/O的文件描述符,指向流缓存的指针(标准I/O缓存,由malloc分配,又称为用户态进程空间的缓存,区别于内核所设的缓存),缓存长度,当前在缓存中的字节数,出...
2019-06-25 08:27:48
497
原创 一、Linux系统IO编程——系统调用之文件IO与标准IO
一、系统调用1. 系统调用的概念Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。随Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,...
2019-06-21 15:12:28
1820
4
原创 十四、Linux下线程的死锁
一、死锁的概念一般情况下,如果同一个线程先后两次调用lock,在第一次调用时,由于锁已经被占,该线程会挂起等待别的线程释放锁,然而锁正是被自己占着的,该线程又被挂起,没有机会释放锁,因此,就永远处于挂起等待状态了,这叫做死锁(Deadlock)。另种典型的死锁情形是这样:线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放锁2,而这时线程B也调用...
2019-06-18 15:40:29
289
原创 十三、Linux下线程的信号量
信号量相关功能一、信号量的概念1.线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。但如果是普通变量,来自同一程序中不同线程的冲突操作所导致的结果将是不确定的。信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。信号量是用来调协线程对共享资源的访问的。2.最简单的信号量...
2019-06-17 15:48:31
316
原创 十二、Linux下线程的同步—条件变量读者与写者问题
一、 案例写者读者案例,线程对共享资源写,写完成后读者继续读,当读取完成后,在通知写者继续写,依次循环。存在以下几种情况:1 个写者,1 个读者1 个写者,多个读者多个写者,多个读者1. 案例1——一个写者,一个读者。include<stdio.h>#include<stdlib.h>#include<string.h>#include...
2019-06-12 10:23:07
324
2
原创 十一、Linux下线程的同步—条件变量
一、条件变量的概念1. 条件变量基本概念条件变量是线程同步的一种手段。条件变量用来自动阻塞一个线程,直到条件(predicate)满足被触发为止。通常情况下条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个或者多个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"信号。条件变量是利用...
2019-06-05 17:07:33
194
原创 C语言中使用sprintf()函数
1. 函数原型#include <stdio.h>int sprintf( char *buffer, const char *format, [ argument] … );这个函数包含三个部分的参数:buffer:char型指针,指向将要写入的字符串的缓冲区。format:格式化字符串。即可选参数的想要输入的数据类型。[argument]…:可选参数,可以是任何类型...
2019-05-28 17:39:01
1121
原创 十、Linux下线程的读写锁
一、读写锁介绍1. 读写锁的基本概念读写锁是从互斥锁中发展下来的,读写锁将访问中的读操作和写操作区分开来对待,把对资源的共享者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。在某些读数据比改数据频繁的应用中,读写锁将会比互斥锁表现出很大的优越性。2. 读写锁的状态读写锁与互斥量类似。 但读写锁有更高的并行性,其特性为:写独占,读共享。读写锁有三种状态,读模...
2019-05-28 14:07:01
250
原创 九、Linux下线程互斥锁类型及属性
一、互斥锁的创建和销毁pthread_mutexattr_t是互斥锁属性的数据类型,表示互斥锁的一些属性相关的信息。使用 pthread_mutexattr_init 可以将与互斥锁对象相关联的属性初始化为其缺省值。在执行过程中,线程系统会为每个属性对象分配存储空间。#inlcude<pthread.h>//初始化互斥锁属性pthread_mutexattr_init(pth...
2019-05-27 18:22:41
971
原创 八、Linux下线程的互斥
一、线程的互斥锁为什么使用线程锁在多线程应用程序中,当多个线程共享相同的内存时,如同时访问一个变量时,需要确保每个线程看到一致的数据视图,即保证所有线程对数据的修改是一致的。如下两种情况不存在不一致的问题:每个线程使用的变量都是其他线程不会读取和修改的变量是只读的当一个线程在修改变量的值时,其他线程在读取这个变量时可能会得到一个不一致的值。一个典型的例子是,在一个多线程程序中,两...
2019-05-15 11:47:02
188
原创 七、Linux下线程的同步与互斥基本概念
一、线程的同步与互斥基本概念(1) 线程的互斥多个线程之间有共享资源(shared resource)时会出现互斥现象。线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。假设有若干线程共享某个变量,而且都对变量有修改。如果它们之间不考虑相互协调工作,就会产生混乱。比如,线程A和B共用变量x,都对x执行增1操作。由...
2019-05-15 09:56:17
212
原创 六、Linux下线程属性初始化、销毁、设置和获得分离属性
一、线程的属性线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。a、初始化一个线程对象的属性int pthread_attr_init(pthread_attr_t *attr); 返回值:若是成功返回0...
2019-05-06 18:24:22
485
原创 五、Linux下进程与线程的比较
一、进程与线程启动方式比较进程线程描述fork()pthread_creat()创建新的控制流return/exit()/_exit()return/pthread_exit()从现有的控制流退出wait()pthread_join()从控制流得出退出状态atexit()pthread_clean_push()/pthread_clean_p...
2019-05-05 11:48:07
228
原创 四、Linux下线程的清理函数
文章目录线程的清理函数1. 清理函数的使用线程的清理函数1. 清理函数的使用不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己 所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。最经常出现的情形是资源独占锁的使用:线程为了访问临界共享资源而为其加上锁,但在访问过程中该线程被外界取消,或者发生了中断,...
2019-04-19 14:57:57
835
1
原创 三、Linux下线程的终止
文章目录线程的终止(一)线程终止的三种方式主动方式1.线程的执行函数调用return语句2.调用pthread_exit(void *retval)被动方式3.pthread_cancel(pthread_t tid)(二)pthread_ join()函数详解(三)线程回收线程的终止(一)线程终止的三种方式主动方式1.线程的执行函数调用return语句从线程主函数中return返回。这...
2019-04-17 16:33:20
279
原创 二、Linux下线程的创建
Ⅳ、线程相关函数(一)线程的创建1.线程的创建函数pthread_create函数函数简介 pthread_create是UNIX环境创建线程函数头文件 #include<pthread.h>函数声明 int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_att...
2019-04-16 14:54:49
5113
原创 Can驱动芯片MCP2515如何实现位定时功能详解(使用的为8Mhz的晶振,波特率为什么不能达到1Mhz)
在最近的一次项目中,使用到了SPI转CAN芯片MCP2515,此芯片通过SPI转CAN的接收与发送功能。初期看DataSheet时真是一脸懵逼,经过在网上看了一下教学视频,以及慢慢的研究最后才算搞清楚基本的用法以及理解里面各个寄存器的作用。 如果有同学不怎么会使用MCP2515却又不想看那么多页的DataSheet的,可以看以下的教学视频,你就可以了解大概怎么操作的。这个是众想科技出品的视频,里...
2018-08-23 20:27:08
6377
10
原创 Visual Studio助手VAssistx各版本破解教程
破解方法: 首先,确保自己电脑上正确安装了VS2008及VS2010以上个版本的软件。 之后需要安装Visual Assist X。 软件的下载地址:下载的文件如下: 下载成功之后,进入点击VA_X_Setuo2210.exe进行安装即可。直到安装成功的提示即可。 至于破解方法,因为在VS2010,2012中的Visual Assist X是以Extension的方式安装的,所...
2018-05-30 17:56:39
23482
4
原创 stm32关于串口输出的几种常用方式
在使用stm32做项目时,我们常常会使用到串口调试,通过串口来输出我们想要看的相关参数值,这样既方便有快捷。 具体方法有哪些呢,我自己整理了一下,这个也是借鉴别人的用法而已。希望大家可以相互讨论学习。 1、使用printf语句通过串口输出我们想要的参数值 具体的用法:使用之前必须包含相应的头文件#includeint fputc(int ch, FILE *f){USART_...
2018-05-11 21:31:52
17500
基于STM32F103的W5300硬件协议驱动程序
2018-12-25
书籍《现场总线CANopen设计与应用》
2018-08-04
现场总线CANopen设计与应用
2018-08-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人