![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
EmbeddedOsprey
主攻方向:STM32软件开发,主要开发平台KEIL
展开
-
运算符 % 的妙用
说完位运算,再说说其他的运算符。+ - * / 不用多说,应该都比较清楚,但是还是要注意的就是使用 / 进行整型变量的计算时,它不像平常一样可以得到小数的,而只有整数部分,并没有小数。还有就是各个运算符的顺序,如果不确定哪个先运算,不如加上括号()吧,不用担心效率的问题,因为加了括号只是告诉编译器该如何处理这条语句而已。另外使用#define定义一些表达式的时候也最好加上括号,因为你不能确定你这个...原创 2019-03-01 21:27:45 · 15346 阅读 · 0 评论 -
C语言系列文章之volatile
和 const 不同(关于 const 可以看 const 小节),当一个变量声明为 volatile,说明这个变量会被意想不到的改变。最为典型的就是 I/O 的输入寄存器了,因为这个变量的值和外部电平有关系,一旦外部电平发生了变化,那么这个变量也就跟着变。当然还有其它寄存器也是如此,比如各种状态寄存器、定时计数器等,他们的改变是靠硬件来改变的,你的程序只能读取数据,所以一定要申明为 volati...原创 2019-03-01 20:55:08 · 231 阅读 · 0 评论 -
C语言系列文章之static
先总结一下 static 的用法,然后再对每一条进行说明:1、 定义全局静态变量2、 定义局部静态变量3、 定义静态函数4、 头文件中使用前面三个应该是很常见的,简要说明即可,重要的是后面那一个不常见,作为重点讲解内容。首先是全局静态变量,看这名字就知道,这个变量有两个属性(姑且就称之为属性吧),第一:这个变量是全局的,也就是说这个变量可以在源文件的任何一个函数中使用,并且始终存在。...原创 2019-03-01 20:59:57 · 571 阅读 · 0 评论 -
C语言系列文章之typedef
Typedef 应该算是很熟悉的关键字了,但是我也只是简单使用罢了,为了比较系统的讲述这一小节,特地上网搜了一下。好了,现在正式开始讲解。Typedef 关键字可以用于给数据类型定义一个别名,比如说你本名叫关谷神奇,我嫌弃这个名字太长了,所以给你取一个别名,叫关谷,以后我叫关谷的时候你就知道在叫你了。当你定义了一个结构体时,每次创建一个结构体都要使用 struct + 结构体名 的方式,而用...原创 2019-03-01 21:05:46 · 175 阅读 · 0 评论 -
C语言系列文章之enum
枚举,顾名思义,就是把一个个可能的值列举出来,它们占用的空间是同一个。这个功能和 #define 有些相似,但又不完全一样,#define 是专业替换户,列举可能的值只是它的其中一种运用方式罢了(关于 #define,可以查看 define 小节)。怎么理解呢?就比如一个玻璃瓶,你规定只能用它装水、饮料、酒这三样东西(枚举所有可能值)。当你装了水之后,如果你想用它装饮料的话,你就只能把水倒掉之后...原创 2019-03-01 21:14:01 · 473 阅读 · 0 评论 -
C语言系列文章之union
联合体,就是将几种数据类型联合起来的一种数据结构,但是它们共用一个空间。怎么理解呢?川剧变脸见过没,就是来来回回的变来变去,给人看的眼花缭乱的,但是不管你怎么变,面具下的脸却始终不变。同样的道理,各种数据类型就是各种脸谱,对外展现了不同的形象,唯一不变的就是它的内存空间的二进制数据始终都是一样的,它们占用的空间也是同一个地方,只是这些二进制数据当你把它看成浮点型的时候,它是浮点数;当你把它看成无...原创 2019-03-01 21:33:50 · 289 阅读 · 0 评论 -
一文看懂队列(FIFO)
这里的 FIFO 是先入先出的意思,即谁先进入队列,谁先出去。比如我们需要串口打印数据,当使用缓存将该数据保存的时候,在输出数据时必然是先进入的数据先出去,那么该如何实现这种机制呢?首先就是建立一个缓存空间,这里假设为 7 个字节空间进行说明。缓存一开始没有数据,并且用一个变量 rear 指示下一个存入缓存的索引地址,这里下一个存放的位置就是 0,用另一个变量 front 指示下一个存入缓存...原创 2019-03-08 18:51:09 · 11741 阅读 · 2 评论 -
C语言系列文章之 struct
结构体,怎么理解?你可以把它想象成一个桌面上的文件夹,这个文件夹里面可以有各种各样的文件,当然也还可以再有文件夹的存在,文件夹里面再放文件……。如果你要修改其中一个文件的内容,就是首先通过桌面上的那个文件夹作为入口,然后一个一个的进入文件夹去寻找你需要的文件,找到之后就可以随你修改了。**long、unsigned int 、short、char(相当于各种文件类型,比如 .txt、.c、.h...原创 2019-03-08 19:09:59 · 528 阅读 · 0 评论 -
快来拼接你的代码!(拼接符 ##)
很久就知道了 # 和 ## ,但是都没怎么使用,直到最近的项目涉及到需要编写大量相似的代码之后才决定尝试使用 ## 去简化代码的书写。比如说我的项目需要控制四个通道的电机,四个通道的逻辑控制代码都是类似的,只是对应的硬件和数据信息不同而已。而我是一个讨厌做重复工作的人,所以就想利用 ## 去简化我的代码书写。就比如说代码初始化这一块,总共有四份相似的代码,如果每一个都要去源码的位置进行修改,麻...原创 2019-03-08 19:16:39 · 2120 阅读 · 0 评论 -
巧用补码
如何将12位有符号数转化为16位无符号数原创 2019-03-01 21:28:05 · 943 阅读 · 2 评论 -
uCOS II 之查找最高优先级任务
我们知道在u/COS II中,一个任务只有一个优先级,并且这个优先级在整个系统是唯一的,也就是一个任务也是对应一个优先级。优先级即任务,任务即优先级。我们只需通过优先级就可以找到所有和该任务相关的资源。现在问题是就绪表中有那么多任务处于就绪态,如何从中找到其中最高优先级。方法有很多,其中一个就是for循环找优先级,遍历所有就绪表,从中找到最高优先级,但这里有一个问题,如果就绪表中处于就绪的这个优先...原创 2018-11-28 20:47:27 · 2393 阅读 · 0 评论 -
uCOS II 之任务控制块TCB
任务控制块TCB:OS_EXT OS_TCB *OSTCBCur;OS_EXT OS_TCB *OSTCBFreeList;OS_EXT OS_TCB *OSTCBHighRdy;OS_EXT OS_TCB *OSTCBList;OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1u];OS_EXT OS_TCB OST...原创 2018-11-28 20:48:41 · 2006 阅读 · 0 评论 -
信号量保护
让我们举个例子。记DeviceALocked是一个位于内存中的R/W变量,用于指示设备A是否已经在使用中。任何一个任务,若欲使用设备A,都必须先检查这个变量的值。如果它的值为零,则表示设备可以使用。在任务获取到设备A后,它要把DeviceALocked的值改为1,表示设备A已经被占用。在设备A使用完毕后,该任务通过重新清零DeviceALocked来释放设备A,从而使其它任务可以使用此设备。看起...原创 2018-11-28 20:55:26 · 581 阅读 · 0 评论 -
C语言系列文章之const
const:限定一个变量不允许改变,产生静态作用,const在一定程度上可以提高程序的安全性和可靠性。const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。宏定义:#define xxxx \{xxx}\\后不能有任何字符,包括空格 最后的 “}\”需要最少空一行struct xxxx xxx = {.x1 = xxxxx,.x2 = xxxxx,....原创 2018-12-07 20:43:57 · 321 阅读 · 0 评论 -
C语言之#error/#warning
很多人写了一两年代码可能也没用过#error和#warning吧!我也是如此,因为我之前也不知道C语言中还有这玩意的存在,还是在看别人的代码后才知道有这个东西的。但是事实上你在编译代码的时候它们经常会在你的眼前晃悠,只是你不知道这些东西其实程序员也可以输出来的。看图你就知道了:是不是很亲切啊!对咯,就是编译窗口下面的错误警告信息。你会想,这不是编译器的事情吗?关我们程序员什么事。当然是有用...原创 2018-12-10 12:17:17 · 13307 阅读 · 1 评论 -
写1翻转的一点思考
有些寄存器的有些 bit 位有写 1 翻转的特性,该怎么处理?常用的对某些 bit 进行 & 或者 | 操作不太合适,比如7 6 5 4 3 2 1 01 0 0 0 0 1 1 1假设后面的 3 bit 是翻转 bit,现在要对 4~5 设置为 10b为了不影响其它 bit,一般会采用如下方式:value &= (0xFF | ...原创 2019-05-17 09:56:03 · 238 阅读 · 1 评论