c语言
Leo-Lian
还在路上
展开
-
打印输出的使用
vsnprintf和snprintf是C语言printf家族函数的成员,相关函数列表如下:#include <stdio.h> int printf(const char *format, ...); //输出到标准输出 int fprintf(FILE *stream, const char *format, ...); //输出到文件 in...原创 2018-03-24 17:10:34 · 768 阅读 · 0 评论 -
函数指针与指针函数容易混淆
在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。今天我们从头把它搞清楚 首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。类型标识符 *函数名(参数表)int *f(x,y);首先它是一个函数,只不过这个函数的返回值是一个地址值。函...转载 2018-05-01 22:00:42 · 141 阅读 · 0 评论 -
临界段与开关中断的区别
本篇文章是为了说明进入临界段与普通的禁止和使能中断的区别。普通的禁止和使能中断,在禁止中断时有触发中断的事件发生,当使能中断时该中断不会在响应,说明普通的禁止中断是阻止了中断的发生。而在进入临界段时,有中断发生,在退出临界段时中断会得到响应,说明临街段只是延迟了中断的响应时间,并没有真正的阻止中断。看下面这段测试代码: unsigned int CPU_SR_Save(void);void CP...转载 2018-05-02 13:19:31 · 1218 阅读 · 0 评论 -
MISCA-C
MISRA于1998年发布了一个针对汽车工业软件安全性的C语言编程规范——《汽车专用软件的C语言编程指南》 (Guidelines for the Use of the C Language in Vehicle Based Software),共有127条规则,称为MISRA C:1998。目前MISRA C:2004版已有141条规则,21个类别,每一条规则对应一条编程准则. 如今MISRA ...转载 2018-05-08 15:03:37 · 641 阅读 · 0 评论 -
预处理器标识#error的目的是什么
编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。下面举个例子:程序中往往有很多的预处理指令#ifdef XXX...#else#endif当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译:#ifdef...转载 2018-05-16 16:22:02 · 4804 阅读 · 0 评论 -
typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedef[cpp] view plain copyint i;//定义一个整型变量i typedef int myInt; myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的用法,下面首先介绍一下函数指针。函数指针的形式:形式1:返回类型(*函数名)(参数表) [cpp] view plain copy#include &l...转载 2018-05-24 11:57:44 · 287 阅读 · 0 评论 -
near、far、huge关键字
far即为远地址,16位模式下(如80x86系列)内存是分段寻址的; (一个段就是 2^16,即64k)指定void far fun1();的话,是说函数fun1的入口点在其它段中,调用时将用到段地址; 如果指定为near的话,入口点将在本段之内,调用时值使用段内的偏移地址。 32位中采用线性的平坦寻址方式,这一概念已被抛弃了,内存中地址统一为32位宽,大体 说来就是这样,细节参见相关资料...转载 2018-05-30 09:47:32 · 1910 阅读 · 0 评论 -
指针的基本知识
1、从变量的三要素开始谈起 为了把复杂的事情说简单,我们抛开指针先从变量谈起。(好吧,不知道这个笑话是不是够冷)一个变量(Variable),或者顺便兼容下面向对象(OO)的概念,我们统一称为对象(Object),除了保存于其中的内容以外,只有三个要素:1)由一定宽度无符号整数(Unsigned Integer)所表示的地址“数值”(Address Value)2)对象的大小(Siz...转载 2018-08-06 16:55:04 · 512 阅读 · 0 评论 -
结构体中函数指针初始化
/** * 为结构体中的指针数组赋值 */#include <stdio.h>typedef struct test{ void (*p)(void); void (*q)(void); void (*y)(void);}test;void f1(void){ printf("f1\n");}void f2(void){...转载 2018-08-17 23:01:36 · 4148 阅读 · 0 评论 -
封装另一种思路的按键扫描方式
{unsigned char Trg;unsigned char Cont;unsigned char keep_Trg;unsigned char keep_Cont;unsigned char KeyEncodeStatus;unsigned char keepKeyEncodeStatus;#define key_null 0x00#defin原创 2018-02-01 15:11:28 · 432 阅读 · 0 评论 -
static的作用域
一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。静态全局变量有以下特点: 该变量在全局数据区分配内存; 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化); 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的; 静态变量都在全局数据区分配内存,包括后面将转载 2017-07-24 23:30:50 · 4677 阅读 · 0 评论 -
自定义协议传输格式
参考自定义协议格式: 串口接收处理程序:`void DealNAVIComMag(void){ u8 i,data; static u16 MagLen,MagLenMax; static u8 ComMagStatus; static u8 checksum; static u8 MsgPackage[256]; //De原创 2017-08-16 22:24:58 · 4258 阅读 · 0 评论 -
GUI程序设计框架要点
typedef struct menu_sitem_info_s { uint8_t osd_type; //0:SpiOSD 1:FontOSD..failed. not using void (*pPressFun)(U8, U8, U8); //linked function uint32_t x原创 2017-08-16 22:39:00 · 471 阅读 · 0 评论 -
C语言宏定义##连接符和#符的使用
[cpp] view plain copy print?#include<stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(f(1,2))); printf("%s\n",g(f(1,2))); return 0; } 在转载 2017-07-25 23:22:40 · 18928 阅读 · 2 评论 -
简单数组FIFO
//简单的缓存读取数据机制。#define CORE360CMDBUFFMAX 10#define CORE360CMDBUFFLENGTH 26_UART_360DEC_ BYTE gCORE360CmdBuffer[CORE360CMDBUFFMAX][CORE360CMDBUFFLENGTH];_UART_360DEC_ BYTE gCORE360CmdWrtIndex;_UART_36原创 2017-11-29 15:37:45 · 364 阅读 · 0 评论 -
((硬件spi+dma)+模拟spi)驱动LCD5110
#ifndef __spi_dma_h__#define __spi_dma_h__#include "stm32f10x.h"#define buffersize 800#define SPI1_DR_Addr ( (u32)0x4001300C )#define SPI_DMA //开启DMA功能void SPI1_DMA_Configuration( void );void SPI1原创 2017-12-08 11:38:57 · 2397 阅读 · 0 评论 -
栈的理解 IAR/MDK修改stack/heap
栈的理解一个程序大体上讲都是由变量和函数组合而成,变量有全局变量和局部变量,还有函数间传值的参数以及返回值。Stack是为了程序运行过程中临时保存所需数据而在内存里分配的一小块空间。保存的数据类型一般情况下包括以下几种:函数中声明的局部变量以及参数函数返回值中断时CPU 寄存器值函数运行后返回的地址比方说下面的例子,函数里声明的局部变量保存在stack里面,在该函数中调用其他函数的时候其他原创 2017-12-13 14:19:12 · 8575 阅读 · 0 评论 -
计算CRC校验码
// CRC 高位字节值表static const uint8_t s_CRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x转载 2017-12-05 16:37:01 · 934 阅读 · 0 评论 -
KEY_unit
/************************************************************************************************************ 模块名称 : 按键驱动模块* 文件名称 : bsp_key.h* 版 本 : V1.0* 说 明 : 头文件** Copyright转载 2017-12-07 17:03:40 · 398 阅读 · 0 评论 -
全局变量的替换方式
单文件内使用static变量或结构体 ,需要外部模块来修改参数的时候,就使用函数接口来实现/////////////////////////////////////////////////////////////////////////////举个例子,不加互斥量,如下_static uint32_t g_cell_voltage = 600;void set_cell_voltage(uint32原创 2017-07-24 23:19:44 · 7305 阅读 · 0 评论