![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
车小猿
这个作者很懒,什么都没留下…
展开
-
C使用宏定义封装printf实现日志功能
问题在日常的开发中,我们经常会在代码中加一些信息便于调试和反查bug,加的这些打印对我们来说是很有帮助的,并且我们在代码发布的时候并不想删除他们,但又不想他们继续打印这些信息;思路如果需要可控的输处日志信息,最好的是我们程序有个日志系统(不是写入内核的环形缓冲区How can I write to dmesg from command line),但嵌入式设备应用一般是轻量级应用,不好带臃肿的日志库,所以最好我们能封装printf;使用宏定义开关C99规范(目前大部分嵌入式开发都基于该标准)后,编转载 2020-10-19 11:34:49 · 1428 阅读 · 0 评论 -
C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 https://www.cnblogs.com/ransn/p/5081198.html例子:__align(),__attribute((aligned (n))),#pragma pack(n)#include <stdio.h> main()...转载 2019-12-13 16:09:19 · 323 阅读 · 0 评论 -
C语言中volatile关键字的使用
volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。作用编辑简单地说就是防止编译器对代码进行优化。比如如下程...转载 2019-12-13 11:48:41 · 716 阅读 · 0 评论 -
内存管理
内存管理分配:类似于单片机使用库时,库对单片机片上外设寄存器地址的封装成结构体来操作//系统参数结构体typedef struct{ unsigned int parameter0; unsigned int parameter1; unsigned int parameter2; unsigned int parameter3; ....... unsigned...原创 2019-12-12 18:13:21 · 202 阅读 · 0 评论 -
__attribute__(at(绝对地址) )
#define UsartRxBuffAddressArmEntry 0X20001000#define UsartRxBuffSize 0x400unsigned char USART_RX_BUF[UsartRxBuffSize ] __ attribute __((at(UsartBuffAddressArmEntry ))); //将串口接收的数据定位存放到RAM中...原创 2019-12-12 17:28:32 · 823 阅读 · 0 评论 -
想成为嵌入式程序员应知道的0x10个基本问题
考:http://www.cnblogs.com/zhengmeifu/archive/2010/03/02/To_be_embeded_system_programer.html预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 36...转载 2019-03-30 22:48:11 · 144 阅读 · 0 评论 -
C语言之单链表(头结点与节点结构相同)
头文件typedef int datatype ;typedef struct node{ datatype data; struct node *Next;}node , list;list *InitList(void); //初始化头节点node *CreateNode(node *data); ...原创 2019-01-23 17:50:11 · 1406 阅读 · 0 评论 -
C语言之字符串输入(通用无Bug)
看代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *MyGetStr1(char *buf, int size);char *MyGetStr2(char *buf, int size);char *MyGetStr1(char *buf, int size){ ...原创 2019-01-24 17:34:15 · 302 阅读 · 0 评论 -
C语言之单链表(头结点与节点结构不相同)
上代码:头文件:#ifndef __PLINK_H#define __PLINK_H#define NAME_LEN 20#define PHONE_LEN 20#define COMPANY_LEN 20typedef struct PersonNode{ char name[NAME_LEN]; char phone[PHONE_LEN]; char...原创 2019-01-24 17:18:44 · 1417 阅读 · 0 评论 -
C语言之双向链表(头结点与节点结构不相同)
双向链表主要注意:1、插入节点要考虑到是在第1个节点和最后一个节点上,或者是中间,因情况不同处理的方法也不同2、移除链表上的一个节点要考虑是1个节点还是最后一个节点上,或者是中间,因情况不同处理的方法也不同头文件:#ifndef __PLink2_H#define __PLink2_Htypedef struct Node{ char name[20]; c...原创 2019-01-24 17:08:51 · 1180 阅读 · 0 评论 -
C语言函数指针
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数//函数指针Type (*函数指针名)(T1 t1, T2 t2, ..., Tn tn); //未初始化形式的函数指针定义,不推荐Type (*函数指针名)(T1 t1, T2 t2, ..., Tn tn) = FuncCodeAddr //FuncCodeAddr:代码区空间地址 ...原创 2019-01-17 20:39:22 · 105 阅读 · 0 评论 -
递归之斐波那数列
非递归斐波那数列:int fun1(int n){ int f1 = 1; int f2 = 1; int sum = 0; int i = 0; if(n <= 0) return -1; if(n == 1 || n == 2) return sum = 1; printf("%d\t%d\t", 1, 1); fo...原创 2019-01-17 20:21:09 · 551 阅读 · 0 评论