C
luckywang1103
每天多一点思考
展开
-
结构体的最后定义一个大小为0 的数组
有很多结构体的最后都定义了一个大小为0 的数组,如drivers/oprofile/cpu_buffer.h中struct op_sample { unsigned long eip; unsigned long event; unsigned long data[0];};结构体最后的长度为0的数组是GCC中广泛使用技巧,常用来构成可变长缓...转载 2020-01-22 20:53:22 · 2519 阅读 · 0 评论 -
字节对齐
字节对齐单位a. linux 32位默认4字节对齐,64位默认8字节对齐b. 结构体最大成员(基本数据类型)c. 预编译指令 #pragma pack(n)手动设置,n-只能填1 2 4 8 16上面三者取最小的,就是实际对齐单位结构体的整体大小必须为实际对齐单位的整数倍#include <stdio.h>int main(){ //8 bytes ...原创 2019-11-10 19:03:34 · 191 阅读 · 0 评论 -
auto extern static register
auto函数内定义的变量(即局部变量)为auto类型,进入函数或者语句块自动申请内存,退出语句块或函数时被自动释放。 函数外定义的变量(即全局变量)为extern类型。staticstatic变量 静态局部变量 作用域为函数,生存期和整个程序生存期一样 静态全局变量 作用域为本文件,禁止其他文件访问static函数 作用作用域为本文件externextern变量 在file1中定义,在fi原创 2015-11-05 21:47:09 · 482 阅读 · 0 评论 -
Linux 程序获取文件系统挂载信息
linux shell可以通过查看/etc/mtab或者/proc/mounts文件来获取当前文件系统挂载信息,程序内直接读取/etc/mtab或者/proc/mounts,解析字符串较为繁琐,可以使用mntent.h提供的库函数FILE *setmntent(const char *filename, const char *type);struct mntent *getmntent(FILE转载 2015-11-13 19:42:33 · 3877 阅读 · 0 评论 -
Linux下测试程序运行时间
int gettimeofday(struct timeval tv,struct timezone *tz);struct timeval { int tv_sec; int tv_usec;};#include <time.h> #include <stdio.h> #include<sys/time.h>int main(void){ struct time转载 2016-04-13 18:02:27 · 2526 阅读 · 0 评论 -
setjmp/longjmp
goto是局部跳转,只能在一个函数内实施的跳转。 setjmp与longjmp是非局部跳转#include <setjmp.h>int setjmp(jmp_buf env);void longjmp(jmp_buf env, int val);在希望返回的位置上调用setjmp,当在可能出现错误的位置上调用longjmp,函数返回就好像又回到了setjmp返回的地方。static jmp_b原创 2016-04-13 20:09:39 · 779 阅读 · 0 评论 -
#if/#if defined/#ifdef
#if #elif #else #endif#if 条件1 代码段1#elif 条件2 代码段2...#elif 条件n 代码段n#else 代码段n+1#endif如果#if后面的常量表达式为true,则编译他所控制的代码.#define MY_VERSION 1#if MY_VERSION == 1 printf("my version原创 2016-05-11 19:49:12 · 979 阅读 · 0 评论 -
C语言常见编译错误与执行错误
编写fasync_jni应用程序放在Tiny210开发板上跑会出现如下错误: 然后编写一个最简单的hello world程序放在Tiny210开发板上跑也会出现类似这样的错误:hello: line 1: syntax error: unexpected word (expecting “)”)解决办法:加上-static选项,arm-linux-gcc hello.c –static –o he原创 2015-09-25 16:04:41 · 4415 阅读 · 0 评论 -
linux信号
和进程退出相关的信号向进程发送信号导致进程异常退出调用函数kill()发送信号 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);调用函数 kill() 后,进程进入内核态向目标进程发送指定信号;目标进程在接收到信号后,默认信号处理程序被调用,进程异常退出。用kill命令发送信号 kill SIG原创 2016-06-19 10:34:57 · 363 阅读 · 0 评论 -
Linux 中直接 I/O 机制的介绍
对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输,所以该文件访问的机制称作为直接 I/O。Linux 中就提供了这样一种文件访问机制,对于那种将 I/O 缓存存放在用户地址空间的应用程序来说,直接 I/O 是一种非常高效的手段。本文将基于 2.6.18 版本的内核转载 2016-12-08 15:06:26 · 388 阅读 · 0 评论 -
linux编码规范 - 代码中的标记
TODO: 说明 在标记处有功能代码待编号,待实现的功能在说明中会简略说明FIXME: 说明 标记处代码需要修正,甚至代码有错误,需要修复,在说明中会简略说明如何修复XXX: 说明 标记处代码虽然实现了功能,但实现的方法有待提高,希望将来改进linux编码规范系列文章 linux编码规范 - coding style & sparse linux编码规范 - 代码中的标记原创 2017-05-04 11:11:53 · 970 阅读 · 0 评论 -
linux编码规范 - coding style & sparse
一、Lindent位于scripts/Lindent,源代码对齐工具,能够自动修正代码中的缩进等手册介绍:http://www.gnu.org/software/indent/二、checkpatch.pl位置:scripts/checkpatch.pl三、Linux coding style中文翻译http://www.embeddedlinux.org.原创 2015-04-13 22:22:12 · 2689 阅读 · 0 评论 -
C语言小知识点总结
宏1、可变参数宏...和__VA_ARGS___VA_ARGS_是一个可变参数的宏,是新的c99规范中新增的,目前似乎只有gcc支持(VC6.0不支持)宏定义中参数列表的最后一个参数为省略号(也就是3个点),这样预定义宏__VA_ARGS_就可以用在替换部分中,替换省略号所代表的字符串。比如define PR(...) printf(__VA_ARGS_)int main()...原创 2015-03-09 17:35:34 · 1207 阅读 · 0 评论 -
嵌入式中通过可变参数va实现printf
最近在做一个和dsp相关的代码,dsp中通过配置寄存器实现了hifi_puts可以打印字符串,但是还不能像pc上编程一样使用printf打印可变参数,通过下面的方法hifi_printf可以打印可变参数。int hifi_printf(const char *fmt, ...){ va_list va; char str[256]; int ret;原创 2017-12-20 09:48:28 · 377 阅读 · 0 评论 -
linux控制cpu占用率
之前在上提到说控制cpu的使用率使能在任务管理器上画一条正弦线 现在下面提供一个在Linux平台上实现的控制cpu频率在某个值 cpu_load.c#include #include #include #include #include using namespace std;typedef long long int int64;const int NUM_THREAD原创 2018-01-30 10:24:35 · 5635 阅读 · 8 评论 -
linux进程的interruptible sleep状态和uninterruptible sleep状态
linux进程有两种sleep状态,一种是interruptible sleep,处在这种状态的进程是可以接收外部信号的,cat /proc/xxx/statusName: sysmgtState: S (sleeping)另一种是uninterruptible sleep,处在这种状态的进程不接收外来的任何信号,所以用kill -9也杀不掉这种进程。cat /proc/xxx/sta...原创 2019-01-25 10:11:20 · 4872 阅读 · 0 评论 -
C语言中运算符优先级
同一优先级的运算符,运算次序由结合方向所决定。 简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符口诀: 圆号框号,箭头一句号 后加后减非反,前加前减负正 指针地址长度 乘除加减左右移,小等大等等等不等 按位与按位或,逻辑与逻辑或 条件赋值逗号 单目条件赋值右结合转载 2015-08-16 13:51:26 · 583 阅读 · 0 评论 -
-DDEBUG编译标记
想必大家都有利用输出函数如printf来帮助我们调试程序的经历,这是一种比较原始的程序调试辅助方法,在Linux下也可以为我们所用。不过这种方法有一个明显的缺点,就是在调试完后我们必须注释或删除掉这些辅助代码。Linux C提供了-DDEBUG这个编译标记来定义DEBUG这个符号,借助于该符号,我们可以在应用程序中添加额外代码并根据需要决定执行与否。 如: #include //转载 2014-06-17 21:38:56 · 7612 阅读 · 0 评论 -
linux代码相关的工具
函数调用关系codevizhttp://blog.csdn.net/npy_lp/article/details/6975676calltreegprof, kprofhttp://blog.chinaunix.net/uid-20749137-id-718762.htmlgraphvizgdb & backtracestracehttp://blog....原创 2015-04-15 21:34:49 · 908 阅读 · 0 评论 -
指针函数和函数指针
一、在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变转载 2013-08-22 13:40:56 · 820 阅读 · 0 评论 -
keil c中文件打包成lib文件
1.选择:projects - options for target 'target 1' , 在 output 页选中 create library , 使将要打包的文件生成LIB和OBJ文件.如将如下文件:/***************************************************/#include #d转载 2013-08-20 11:15:48 · 6194 阅读 · 2 评论 -
用C语言自造LCD1602中文库
这个程序里面搭配了火焰检测模块,使用的是ADC0,AD转换,显示的电压值可以根据光谱亮度进行变动。网上的1602字库,大多用汇编语言编写,可移植性太低。我这个是用C语言编写的。1602的字库,你们可以看到,显示了中文“月”与“工”。001#include "iom16v.h"002#include "macros.h"转载 2013-08-16 19:09:12 · 1760 阅读 · 0 评论 -
造成segmentation fault的可能原因分析
1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snpr转载 2013-10-20 22:49:15 · 3331 阅读 · 0 评论 -
keil中调试时执行到prinitf停住不继续进行问题解决
printf( )和scanf()在包含在stdio.h中 库函数printf( )的发送原理:首先在初始化时要把TI置1,如果不这样做,你的程序是会一直在JNB TI,$这条指令上跑;所以要在printf语句之前加上一句TI=1;才能使继续执行下去:详细例子如下:#include#include#define DEBUG //在调试的时候加上这句话,正式编译的时候注原创 2013-08-22 11:02:18 · 1924 阅读 · 0 评论 -
C专家编程——读书笔记
1、总线错误与段错误bus error(core dumped) 总线错误(信息已经转储)segmetation fault(core dumped)段错误(信息已经转储)这种错误相信只要你在unix用c,c++这两种错误是常见又是很头疼的错误,来看看作者怎么解说的:产生原因: 当硬件告诉操作系统一个有问题的内存引用时,操作系统通过发送信号给有问题的进程进行交流。(信号是一种事件通原创 2013-10-24 23:05:20 · 1066 阅读 · 0 评论 -
C语言错误处理方法
1、errno需包含头文件errno.h当一个系统调用或者库函数的调用失败时,将会重置错误代码errno,用户在判断程序出错后,立即检查errno的值以获取错误代码和错误信息。此时errno被系统设置为某个数,这个数就是错误代码。可以使用printf("%d",errno);的方式输出2、strerror需包含头文件string.hchar * strerror(int原创 2013-12-30 19:57:06 · 2635 阅读 · 0 评论 -
unsigned int 与 int
之前看过很多类似的博客知识点,老是记不住,现在在自己总结一下吧,可能说的不对,望大家指教。1、unsigned intunsigned int a = -1;unsigned int b = 1;printf("a=0x%x \n", a);if(a > b) printf("a>b \n");输出:a = 0xffffffff;a>b2、int原创 2014-01-11 15:15:14 · 1524 阅读 · 0 评论 -
回调函数
1、面向过程的回调函数回调在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调回调函数可以象普通函数一样被程序调用,但是只有它被当作参数传递给被调函数时才能称作回调函数。如果赋了不同的值给该参数,那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。比如函数A(char *, void (*fun)),传递给fun不同的函数地址来处原创 2014-01-19 21:34:57 · 801 阅读 · 0 评论 -
交叉编译glibc
CC=arm-linux-gnueabi-gcc ./configure --prefix=/home/lei_wang/usr_lib/ --host=arm-linux --cache-file=arm-linux.cache原创 2014-08-22 21:54:30 · 5574 阅读 · 0 评论 -
Unicode与UTF-8互转(C语言实现)
世界上存在着多种编码方式, 同一个二进制数字可以被解释成不同的符号. 因此, 要想打开一个文本文件, 就必须知道它的编码方式, 否则用错误的编码方式解读, 就会出现乱码.转载 2014-08-17 19:54:15 · 884 阅读 · 0 评论 -
assert函数总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.转载 2014-12-25 19:54:54 · 727 阅读 · 0 评论 -
可变参数, va_start, va_arg, va_end
typedef char *va_list;#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址#define va_arg(ap,t) ( *(t *)((a原创 2015-01-18 17:12:29 · 1023 阅读 · 0 评论 -
linux创建静态库和动态库
2015新年第一篇博客,哈哈,这个2月还没写过博客呢,从现在开始继续!在本例中将创建一个小型函数库libfoo,包含两个函数bill()、fred()1、编辑两个文件bill.c和fred.cbill.c#include void bill(){ printf("bill:we passed\n");}fred.c#include void fred()原创 2015-02-22 15:36:40 · 1042 阅读 · 1 评论 -
oprofile库安装与使用
一、概述oprofile库是linux平台上的一个功能强大的性能分析工具,支持两种采样方式:基于事件的采样与基于时间的采样。1)基于事件的采样:oprofile只记录特定事件(比如L2 cache miss)的发生次数,当达到用户设定的值时,oprofile就记录一下(采样一次)。这种方式需要CPU内部有性能计数器。2)基于时间的采样是oprofile借助OS时钟中断的机制,每个时转载 2015-03-05 22:57:07 · 4909 阅读 · 3 评论 -
pkg-config
环境变量:PKG_CONFIG_PATH,pkg-config将在该环境那原创 2014-08-22 20:23:17 · 1612 阅读 · 0 评论 -
#if 0 .... #endif作用
因为/**/注释不可以嵌套,嵌套存在二义性所以就用#if 0...#endif相当于把中间省略号的部分都注释掉#if 0 ... #endif由预处理器处理,可以屏蔽掉一段代码。对于#if 0 ... #endif,它与/**/相比的优越性在于:1、它可以允许嵌套(层数上限由预处理器决定);2、你随时可以把#if 0改成#if 1来取消对某段代码的屏蔽。原创 2013-04-15 10:03:16 · 1020 阅读 · 0 评论