C/C++
井朝天
你,还好吗?
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
gcc中的#和##操作符以及调试宏
<br />gcc在标准c上作了很多扩展,而Linux内核代码也依赖gcc的一些特性,这样限制了使用其他编译器编译内核<br />gcc本身又支持多种cpu构架,我觉得这样也是Linux的自我保护<br />#是字符串化操作符,可以把当前内容转换为字符串<br />##是连接操作符,可以在预处理阶段实现字符串的链接操作<br />#include <stdio.h><br />#include <stdlib.h><br />#define dprintf(expr) printf("%s=%d/n",#e转载 2010-10-10 13:24:00 · 1440 阅读 · 0 评论 -
大小端编程注意事项
一般情况下,我们所遇到的都是小端的情况,典型的X86处理器就是小端的。但是,好多powerpc处理器可以被配置为大端模式,也可以被配置为小端模式。所以,经常会出现以前的代码运行的好好地,到了新板子,或者板子配置发生了变化,结果就不对了,而且很难调试。因为根本不会认为它出错。下面就举个我们代码中调了好久才发现的问题。又一个函数:i2c_write(..., unsigned ch原创 2012-01-31 16:46:45 · 1051 阅读 · 0 评论 -
unsigned signed类型区分很重要
也许,我们写起代码来随手就是定义一个int 或者char型的数据。我们有没有想过这个数据到底是有符号还是无符号呢,它到底需要一个符号吗,会溢出吗?比如最简单的两行代码char ch = 0x90;printf("%02x", ch);你期待什么输出结果, 是90吗?但是结果可能不是你想的得出结果是ffffff90,到底是为什么呢?char型在我的平台上默认是sign原创 2012-02-10 17:29:07 · 1239 阅读 · 1 评论 -
TWL6030 电源管理芯片中断注册,处理过程
TI TWL6030 是一款功能强大的电源管理芯片。集成了很多功能,可以对整个板卡上的各设备进行供电和电源管理,功能大致和PC上的电源类似,就是一端插上电源,另一端分出来好多电源线,分别给处理器,内存,硬盘等供电。只不过有了电源管理芯片,各个电压可以配置。本文主要讲TWL6030上各设备中断处理过程。为什么用这个来讲,主要是它很特殊,我们知道,普通的设备只有一根中断线接到原创 2012-05-10 20:23:03 · 3312 阅读 · 0 评论 -
C语言函数内部改变指针本身
今天发一个C语言基础的小知识点:C语言中函数参数传递方式只有一种:值传递。 可能大家在刚开始学习C的时候都被一些教材误导,认为C中有值传递和地址传递两种方式。其实只有值传递一种,无论函数以什么形式进行传递,其实传递的都只是参数的一份拷贝! 举个简单的例子,一个改变某个整型变量参数的函数int change_value(int *pChange, int val){原创 2011-06-14 17:06:00 · 10013 阅读 · 7 评论 -
MIPS busybox
编译一个MIPS平台的busybox,老是编译不过去。从出错信息看是MIPS编译器问题。ftp://ftp.ingenic.cn/3sw/01linux/00toolchain/mipseltools-gcc412-glibc261.tar.bz2下载最新的 busybox-1.20.2源码然后make menuconfig配置编译器路径和静态编译。就可以了。另外,如果原创 2012-10-18 17:22:31 · 2510 阅读 · 0 评论 -
不要在头文件中定义变量
在写C代码的时候,经常需要在头文件中包含有些预定义的信息。比如一些结构体的声明,外部变量,函数的声明等。有时候觉得有必要在头文件中定义一些变量,这样在源文件中就不需要定义了。但是这样做,有很大的问题。比如//test.h 1 #ifndef _TEST_H 2 #define _TEST_H 3 int x; 4 const char *name = "hhcn";原创 2012-10-23 14:59:12 · 10378 阅读 · 4 评论 -
Linux使用静态库
以下一个简单的小例子来学习如何使用静态库hello.c hello.h main.c Makefile总共4个文件,逐一来看hello.h#ifndef _HELLO_H#define _HELLO_Hextern int test(void);#endifhello.c#include int test(void){print原创 2012-11-12 15:39:09 · 902 阅读 · 0 评论 -
君正JZ4770 bootloader中对nand 进行分区
Android系统有好几个分区。system, data, flash等以下是jz4770平台上某款设备的分区信息/dev/block/mmcblk0p1 /system ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0/dev/block/mmcblk0p2 /data ext4 rw,nosuid,nodev,relati原创 2013-01-04 18:46:32 · 2606 阅读 · 0 评论 -
深入理解指针函数
1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。转载 2012-01-10 15:27:12 · 557 阅读 · 0 评论 -
深入理解typedef
typedef作为类型定义关键字,用于在原有数据类型(包括基本类型、构造类型和指针等)的基础上,由用户自定义新的类型名称。 在编程中使用typedef的好处,除了为变量取一个简单易记且意义明确的新名称之外,还可以简化一些比较复杂的类型声明。比如: typedef int INT32;将INT32定义为与int具有相同意义的名字,这样类型INT32就可用转载 2012-01-10 15:26:11 · 610 阅读 · 0 评论 -
淫荡的c函数指针
<br />不用不知道,一用吓一跳<br /><br />无论多么怪异的事情,存在即合理的<br />gcc 版本 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC)<br />#include <unistd.h><br />#include <fcntl.h><br />#include <stdlib.h><br />#include <unistd.h><br />#include <stdio.h><br />static int inline foo(void)<br转载 2010-10-10 13:23:00 · 1385 阅读 · 0 评论 -
结构体中的空指针
说来真是惭愧了,写代码也有2年了,好久没有遇到段错误了,这次的代码,就是一个文本处理,竟然有段错误。真是羞死人! 到底怎么产生的呢?原来。一个函数的参数为结构体指针,该结构体中有两个变量,均为指针,在引用该结构体指针中的变量(也是指针)没有进行空指针判断!!!唉,以后要注意了。代码运行到一段时间提升segment fault。没有任何提示。因为不是每次都遇到空指针,所以很难调试,所以以后写代码还是要注意啊!原创 2010-12-06 10:52:00 · 4598 阅读 · 0 评论 -
关于函数返回指针
<br /> 昨天遇到一个小问题。假设function foo()返回一个指针,该函数目的在于从系统中获取一些信息,然后以指针的形式返回给用户。<br /> 这里的指针是指向一个全局变量的(比如用一个全局的结构体来保存信息)。当用户区调用的时候,可以先声明一个指针,让后将<br />结果返回给该指针。当用户每次调用之后就使用该指针时不会出现问题。但是当再次调用foo()并传递其他参数就会出现如下问题:typedef struct xxx_val {...}xxx_val_t;原创 2010-12-14 10:23:00 · 826 阅读 · 0 评论 -
老话题了,指针作为参数被sizeof
<br />大家都已经知道当数组作为函数参数传递的时候会退化为指针。<br />但是在使用的时候还是经常会犯错,在函数<br />int get_pexEeprom(pPexIns_t *pPexIns, char *pexEeprom, int bufLen)<br />{<br /> ...<br /> int len = sizeof(pexEeprom); //这里又犯错了<br />}<br /> <br />一般写代码的时候是不会出现在这种低级错误的,但是一般我们会拷原创 2011-06-02 09:47:00 · 2084 阅读 · 1 评论 -
弄懂dup2函数
好长一段时间,都没弄明白dup2(int oldfd, int newfd), 到底是从哪里复制到哪里,主要是《unix环境高级编程》一书翻译的太差,因为对我形成了长期的误导!以至于后来用到管道的时候还时有迷惑,现在终于弄清楚了,因为要记下来,有不对的地方,还请各位好友不吝赐教。int dup2(int oldfd, int newfd);这个是该函数的原型:复制一个文件描述符原创 2011-10-25 11:46:29 · 1624 阅读 · 0 评论 -
Freescale P4080 I2C 驱动分析
Freescale P4080是一款8核心网络处理器,功能强大,外设齐全,基于powerpc e500 core。在嵌入式网络应用上被广泛使用。今天只讨论P4080的I2C部分。P4080片上集成了4个I2C 控制器,在我们的应用中,这4个I2C Controller 都是作为master来使用。先来一张I2C 控制器的结构图这张图描述了一I2C 控制器应该有的寄存器,描述了各原创 2011-11-24 11:16:09 · 3113 阅读 · 0 评论 -
强化C语言的指针类型学习
由于工作需要,要把uboot中的pci扫描代码移植到自己的项目里来,本来都做好了,但是需要稍微修改下uboot里的几个专门为我们的项目使用的文件,也就是uboot导出的函数,供项目使用,但是被告知,目前uboot已经是发布的版本,不能再改变了。怎么办呢?其实pci系统在uboot起来的时候已经初始化好了,在代码中需要的是其中一些变量的地址,有了这些地址,转换成合适的指针,那么就可以进行操作原创 2011-11-25 11:37:59 · 1088 阅读 · 0 评论 -
两个常用的预编译宏
在C语言中,提供了两个预编译宏#define #undef#define大家应该很常用,或许#undef也用过吧。今天要讲的是在项目中遇到的些小问题。以前的代码是为某一种板子写的,现在有了新的板子。所以既要支持新板子,又要保持向老的板子兼容。但是两种板子的资源不同啊,举个简单的例子。两个板子上都有一个I2C MUX (pca9545)但是,两个I2C 地址却不同。原创 2011-12-27 10:48:38 · 1251 阅读 · 1 评论 -
解决不使用Android NDK编译的bin文件No such file or directory问题
使用板子的交叉编译工具链,自己做Makefile来编译一个二进制文件,adb push到板子上运行。会出现No such file or directory问题。明明该文件是存在的,为什么会出现这个问题呢?文件是存在,但是该文件所需要的一些库文件,是不存在的。这个时候就需要静态链接。在Makefile中增加一行LDFLAGS += --static在编译可执行文件的命令中原创 2013-01-17 16:04:42 · 4480 阅读 · 0 评论
分享