C
文章平均质量分 59
king110108
从事汽车电子行业10年
展开
-
void*空指针
void* 指针:可以指向任意类型数据的指针注:任意指针初始位置都是0xCCCCCCCC空指针,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”。void*指针只支持几种有限的操作:①与另一个指针进行比较;②向函数传递void指针或从函数返回void*指针;③给另一个void*指针赋值。eg. int * pint; void * pvoid; pvoid = pint;//right pint = pvoid;/...原创 2021-11-21 19:45:02 · 784 阅读 · 0 评论 -
面试题:单片机裸机和RTOS开发过程中,如何保证全局变量在中断和主循环中读写的正确性
这个面试题时考察的关键字volatile, 临界区,原子操作和锁的概念, 因此首先需要搞清楚这几个知识点以及使用方法。1、关键字volatile 关键字volatile时告诉编译器,被关键字volatile修饰的变量可能会被意外的改变,防止编译器对代码进行优化。举个具体的例子说明这个问题: 比如在某个任务中设置了一个变量g_counter用于计数。 g_counter = 0x01; g_counter = 0x02; g_counter = 0...原创 2021-04-28 21:30:55 · 3696 阅读 · 1 评论 -
C语言中的内联函数inline function
一、 内联(inline)函数c++在编译时可以讲调用的函数代码嵌入到主调函数中,这种嵌入到主调函数中的函数称为内联函数,又称为内嵌函数或内置函数。定义内联函数时,在函数定义和函数原型声明时都使用inline,也可以只在其中一处使用,其效果一样。 内联函数在编译时用内联函数函数的函数体替换,所以不发生函数调用,不需要保护现场,恢复现场,节省了开销。 内联函数增加了目标程序的代码量。因此,一般只将函数规模很小且使用频繁的函数声明为内联函数。 当内联函数中实现过于复杂时,编译器会将它作为一...原创 2020-12-16 13:16:43 · 2190 阅读 · 0 评论 -
浅析if (ConstantValue == Variable)的重要性
最近代码review的时候发现一个同事的一个bug,他把条件判断写成if (speed = HIGH_SPEED),这样会导致什么问题呢?我们贴个错误代码分析看看:#include <stdio.h>#define HIGH_SPEED 120int main(void){ int speed; if (speed == HIGH_SP...原创 2020-01-12 12:15:41 · 254 阅读 · 1 评论 -
74HC595驱动程序
一. 74HC595芯片介绍74HC595是串口转并口芯片,可输出三种状态:高电平、低电平和高组态。一片74HC595芯片可实现3根口线扩展为8根口线.也可采用多片74HC595进行级联的方式扩展输出口线。————————————————Q0~Q7: 并行数据输出端(三态输出);GND: 接地引脚;Q7S: 串行数据输出(多芯片级联时使用);MR: 复位引脚,当引脚接低电平时芯片内部...原创 2019-11-17 10:21:13 · 2623 阅读 · 2 评论 -
C语言实现C++中面向对象特性
C语言是面向过程的语言,因此用C语言进行面向对象编程,则需要做一些预处理。一、使用结构体定义实现对象 面向对象的开发的核心思想就是对象,可以把任何事物抽象成对象,而把程序之间的交互以及调用,对象之间传递消息(实际上就是对象成员函数的调用)的形式来实现。面向对象的语言专门引入了对象类型定义机制,用class关键字实现,C语言中没有专门针对面向对象的思想,也没有引入对象类型定义原创 2017-09-16 12:49:12 · 1593 阅读 · 2 评论 -
嵌入式 C/C++语言精华文章集锦
C/C+语言 struct 深层探索 ............................................................................2C++中 extern "C"含义深层探索........................................................................7C 语言高效转载 2017-09-07 16:39:01 · 13898 阅读 · 0 评论 -
C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句转载 2017-08-04 14:53:38 · 617 阅读 · 1 评论 -
CRC16校验算法程序
const unsigned char code auchCRCLo[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x8转载 2017-07-13 16:12:43 · 1261 阅读 · 0 评论 -
C语言 一个crc32校验算法
#include static const uint32_t crc32tab[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d转载 2017-07-13 15:58:23 · 8001 阅读 · 2 评论 -
C语言和内存初步框架了解
此文将花费您10~15分钟时间,带您简单对内存有一个印象了解。后续将深入介绍!感谢阅读!��1.程序运行为什么需要内存1、计算机程序运行的目的:计算机为什么需要编程?编程已经编了很多年了,已经写了很多程序,为什么还需要另外写程序?计算机有这个新的程序到底为了什么?程序的目的是为了去运行,程序运行是为了得到一定的结果。计算机就是用来计算的,所有的计算机程序其实转载 2017-09-29 11:11:36 · 380 阅读 · 1 评论 -
关于嵌套循环效率研究
引言 大家都知道,当进行嵌套循环时,大循环放最外面和放最里面所造成的执行效率会不同,本篇文章会通过汇编代码进行分析具体情况。 测试环境操作系统:ubuntu-14.04.1编译器:gcc-4.8编译命令:gcc test.c -o test -g -Wall 测试代码: 1 #include 2 3 /* 大循环在外 */ 4转载 2017-10-11 13:09:12 · 1332 阅读 · 0 评论 -
C语言浮点型数据存储结构
1.float类型float类型占四个字节,每个字节占8位,总共32位,其内存结构如下图:31位为符号位:0表示正数,1表示负数31~23位:共8位表示指数位,内存存储数据从0~2^8-1=255,由于指数可以是正也可以是负,所以指数位采用移位存储表示数据,8位有符号有可表示数据从-128~127,所以指数位表示的实际指数应该是无符号位数减去127,例如转载 2018-01-26 15:06:45 · 1143 阅读 · 0 评论 -
写一个c程序辨别系统是16位还是32位
2位处理器就是一次只能处理32位,也就是4个字节的数据,虚拟地址空间的最大大小是4G,而64位处理一次就能处理64位,即8个字节的数据,最大虚拟地址空间的最大大小是16T。最明显的是指针大小的变化,32位系统指针是32位,64位系统指针是64位。其他的,int都是32位,short都是16位,long 32位系统是32位,64位系统为64位,size_t ssize_t 32位系统为32位,64位...转载 2018-03-28 10:34:26 · 1680 阅读 · 0 评论 -
#define用法集锦(非常全)
Definition:The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-stringop...转载 2018-06-19 05:56:19 · 87372 阅读 · 17 评论 -
MPC5607B串口接收中断程序
最近做一个innovation项目时碰到串口接收中断的问题困扰了好久,终于找到知道原因了。项目用到的芯片是NXPMPC5607B,与一个指纹模块通过串口进行数据传输。在已有的Autosar架构的项目的代码中加入指纹模块代码,另外需要对串口进行正确的配置,才能完成最终的功能。串口接收中断 根据解读芯片手册,配置串口需要先配置SUI端口,PCTL寄存器,然后配置Linflex...原创 2019-01-07 18:32:12 · 1520 阅读 · 4 评论 -
移位操作与乘除法之间关系
移位实现的乘除法比直接乘除的效率高很多。用移位实现乘除法运算 a=a*4; b=b/4; 可以改为: a=a<<2; b=b>>2; 说明: 除2 = 右移1位 乘2 = 左移1位 除4 = 右移2位 乘4 = 左移2位 除8 = 右移3位 乘8 = 左移3位 ... ... 通常如果需要乘以或除以2的n...原创 2019-06-22 09:57:44 · 3870 阅读 · 0 评论 -
结构体初始化
memset可以方便的清空一个结构类型的变量或数组。 如: struct sample_struct { char csName[16]; int iSeq; int iType; }; 对于变量 struct sample_strcut stTest; 一般情况下,清空stTest的方法: stTest.csName[0]='\0'; stTest原创 2017-06-23 09:06:21 · 586 阅读 · 0 评论 -
C语言中Union的用法
在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。先看一段代码:union myun{ struct { int x; int y; int z; }u; int k;}a;int main(){原创 2016-04-02 12:01:07 · 1763 阅读 · 0 评论 -
国际C语言混乱代码大赛作品分析!
国际C语言混乱代码大赛作品分析!#include main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?main(2,_+1,"%s %d %d\n"):9:16:t<转载 2015-05-01 21:57:19 · 2763 阅读 · 0 评论 -
C中的volatile用法
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i;转载 2015-05-01 21:50:38 · 486 阅读 · 1 评论 -
c中static的作用
1、函数之外的变量就是全局变量,这个想法正确吗? 答: 在C中,完全正确。只不过按有没有加static修饰可以分为静态全局变量和一般全局变量两种。 2 如果在全局变量的前面加上static 会有什么用? 答:在C中,静态全局变量意味着两个方面。一、在生命期方面,它与一般全局变量一样,是与整个程序共存亡的;二、在可见性方面,它只在定义它的那转载 2015-05-01 21:41:01 · 466 阅读 · 0 评论 -
#ifdef,#else,#endif,#if用法详解
这几个都是预编译指令。预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。关于预处理命令中的文件包含(#i nclude),宏定义(#define),书上已经有了详细的说明,在这里就不详述了。这里主要是对条件编译(#ifdef,#else,#e原创 2015-04-26 12:19:02 · 521 阅读 · 0 评论 -
C语言数组与指针的问题
最近学数据结构,在学数组与指针之间的关系的时候,发现以前一直没理解的一个问题。首先我们看看数组与指针的一些关系吧。如果我们定义一个数组int a[ ] = {1,1,2,3,5,8,},再把一个指针int *p = a;这句话我们该怎么理解呢?其实很简单,我们只要知道这个语句是定义了一个指向整型数组的指针变量p,并且p指向数组的首地址,后面的就迎刃而解了。而a代表的是数组的第一个元素的地址,我原创 2015-06-04 19:46:24 · 868 阅读 · 0 评论 -
查找数组某个元素的下标
昨天写了个程序查找数组元素的下标。折腾了好久才弄出来,自己写出来总结一下。如果要查找某个元素的下标,我们必须知道这个元素的值val是多少,然后要知道数组的首地址pst,和数组的总元素个数len。我们从右往左依次查询数组元素的值看是否等于val,如果等于val就返回该下标,不等于就继续查询。这里涉及到递归算法,实际就是如果查最后一个元素是否我们所查询的值,如果是我们输出len-1就为该值的下标,原创 2015-06-07 11:15:51 · 16219 阅读 · 0 评论 -
VS2005中遇到一些C语言不兼容的问题
最近在VS2005中写C程序,保存的当然是.c文件。出现一些错误,自己百度找到原因了。比如下面程序#include struct myArr{ int *pBase; int len; int cnt;};bool is_empty(struct myArr *pArr);int main(void){ int a[]={};原创 2015-06-06 20:34:21 · 814 阅读 · 0 评论 -
一个小例子分清sizeof(s)和strlrn(s)的区别
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所原创 2015-12-28 11:30:42 · 2926 阅读 · 0 评论 -
c语言程序设计流程图详解
介绍常见的流程图符号及流程图的例子。本章例1 - 1的算法的流程图如图1 - 2所示。本章例1 - 2的算法的流程图如图1 - 3所示。在流程图中,判断框左边的流程线表示判断条件为真时的流程,右边的流程线表示条件为假时的流程,有时就在其左、右流程线的上方分别标注“真”、“假”或“T”、“F”或“Y”、“N”另外还规定,流程线是从下往上或从右向左时,必须带箭头,除此以外,转载 2015-12-28 17:03:18 · 80887 阅读 · 10 评论 -
memset用法详解(转)
功 能 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。用 法 void *memset(void *s, int ch, unsigned n);程序例 #include #i转载 2016-02-05 19:40:13 · 466 阅读 · 0 评论 -
C语言之memcpy函数
【FROM MSDN && 百科】原型: void *memcpy(void *dest, const void *src, size_t n);#include功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中Copies the values of num bytes from the location point转载 2016-02-05 19:55:18 · 691 阅读 · 0 评论 -
mpu6050六轴传感器msp430驱动程序
玩智能车的可以参考#include #include"mpu6050.h"#include "USCI_A0.h"#include "IMU.h "/* * ======== BCSplus_graceInit ======== * Initialize MSP430 Basic Clock System */void BCSplus_graceInit(void){转载 2016-01-12 13:19:21 · 6674 阅读 · 2 评论 -
通过一个小程序看你C语言语法掌握了多少
今天看了《嵌入式系统高级C语言编程》一书中有这么一个例子,可以大概看一个程序员C语言掌握的如何?我看了一下,有一定的代表性,就把它写出来给大家分享一下。/*函数功能:将入口参数ptr所指向的内容通过两个内部缓冲区p和q复制到局部数组buf[]中并将该数组的首地址作为返回值传递到函数外。*/#include "stdlib.h"char * test(char * ptr){ uns原创 2016-02-07 01:16:01 · 933 阅读 · 0 评论 -
一个例子了解static作用
static关键字在C语言中作用非常重要。因此在面试的时候,面试官也经常会拿这个来考被面者。我们用个例子来看看这个关键字的作用吧:#include static int j;void func1(void){ static int i = 0; i++; printf("i = %d\n", i);}void func2(void){ j = 0; j++; pr原创 2016-03-06 16:51:00 · 692 阅读 · 0 评论 -
剖析浮点数在内存中的存储
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而d原创 2016-03-06 17:06:05 · 552 阅读 · 0 评论 -
C语言union关键字
union 关键字的用法与struct 的用法非常类似。union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下:{ char character; int number; char *str; double exp;转载 2016-03-07 16:43:14 · 626 阅读 · 0 评论 -
单片机的C语言中位操作用法
在对单处机进行编程的过程中,对位的操作是经常遇到的。C51对位的操控能力是非常强大的。从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。这也是在各个领域中都可以看到C的重要原因。在这一节中将详细讲解C51中的位操作及其应用。1、位运算符C51提供了几种位操作符,如下表所示:运算符含义运算符含义转载 2015-04-24 22:46:55 · 3423 阅读 · 1 评论