博客首页
注册
建议与交流
排行榜
加入友情链接
推荐
投诉
搜索:
帮助
jiuzhuaxiong
创造属于你的天空,有了问题可以跟大家一起讨论! 在LINUX和VXWORKS嵌入式开发中学到了一些经验跟大家分享!
jiuzhuaxiong.cublog.cn
管理博客
发表文章
留言
收藏夹
· 下载搜索
· 电子博客好友
博客圈
音乐
· 家乡音乐
相册
· 开发照片
导入文章
文章
· C语言技巧讨论
· 前辈经验
· 嵌入式LINUX开发
}
· AT9200 LINUX2.6.10内核移植
· S2C2410LINUX2.6.20内核移植
· U-BOOT移植
· AT91RM9200开发笔记
· LINUX交叉编译器的制作
· SHELL命令学习
· U-BOOT POWERPC移植
· UCLINUX开发笔记
· JFFS2文件系统制作
· 在嵌入式Linux系统中挂载 jffs2 根文件系统
· RAMDISK系统的制作
· LINUX系统启动
}
· LINUX驱动开发笔记
· LINUX内核移植
· ARM嵌入式开发
· MAKEFILE制作
· AVR在LINUX平台下开发
· 嵌入式VXWORKS开发
}
· VXWORKS BSP开发
· VXWORKS在AT91RM9200上的移植
· VXWORKS在MPC860上的移植
· VXWORKS启动过程
· VXWORKS多任务机制
· TCP IP 网络协议
首页
关于作者
姓名:HugBear2008 QQ:280051265 年龄:25 位置:中国.广州 E-MAIL:jiuzhuaxiong@163.com
||
<<
>>
||
我的分类
文章列表 - C语言技巧讨论
C语言面试大全
<DIV> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width=950 bgColor=#ffffff border=0> <TBODY> <TR> <TD vAlign=top align=middle width=235><BR></TD> <TD width=10></TD> <TD vAlign=top width=685> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <TBODY> <TR> <TD align=middle bgColor=#bbf0ff><FONT style="FONT-SIZE: 14pt" color=#000066><B></B></FONT></TD> <TR> <TD> <TABLE style="BORDER-COLLAPSE: collapse" borderColor=#bbf0ff cellSpacing=1 cellPadding=0 width="100%" border=1> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width=650 border=0> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width=650> <DIV id=art style="MARGIN: 15px"> <DIV></DIV> <DIV> <P><FONT size=2><STRONG>1.求下面函数的返回值(微软……
查看全文
发表于:2008-06-03 ┆
阅读(112)
┆
评论(0)
深入理解指针
<DIV> <TABLE style="BORDER-COLLAPSE: collapse" borderColor=#a5bd6b cellSpacing=1 cellPadding=0 width="100%" border=1> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD> <DIV id=art style="MARGIN: 15px"> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="96%" border=0> <TBODY> <TR> <TD align=middle bgColor=#f3f3f3 colSpan=3></TD></TR> <TR> <TD width=7 height=7><IMG alt="" src="http://blog.chinaunix.net/templates/tech/images/w_left_buttom.gif" border=0></TD> <TD bgColor=#f3f3f3></TD> <TD width=7 height=7><IMG alt="" src="http://blog.chinaunix.net/templates/tech/images/w_right_buttom.gif" border=0></TD></TR></TBODY></TABLE> <DIV> <DIV> <DIV style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><STRONG><U><SPAN style="BACKGROUND: rgb(217,217……
查看全文
发表于:2008-04-02 ┆
阅读(127)
┆
评论(0)
C99对除法和取模运算的几处细节
<table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td align="center" height="25"><br> </td></tr> <tr><td bgcolor="#d2dee2" height="1"><br></td></tr> <tr><td bgcolor="#ffffff" height="1"><br></td></tr> <tr><td align="center"> <table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody><tr><td width="100%"> <div id="art" width="100%" style="margin: 15px;"> <div> 1、在C中,整数除法结果的小数部分都被丢弃。这个过程称为“截尾”(truncation)。</div> <div> 2、整数与浮点数进行混合运算时,结果是浮点数。</div> <div> 3、对负数的整数除法,C99要求使用“趋零截尾”。</div> <div> 4、对负数的取模运算,C99规定:如果第一操作数为负,则得到的模为负;如果第一操作数为正,则得到的模为正。</div> <div> </div> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cel……
查看全文
发表于:2008-04-01 ┆
阅读(140)
┆
评论(0)
另外的 C 编程工具
<DIV> <DIV class=cnt id=blog_text><BR> Slackware Linux 的发行版中还包括一些我们尚未提到的 C 开发工具. 本节 <BR>将介绍这些工具和它们的典型用法. <BR>xxgdb <BR> xxgdb 是 gdb 的一个基于 X Window 系统的图形界面. xxgdb 包括了命令行 <BR>版的 gdb 上的所有特性. xxgdb 使你能通过按按钮来执行常用的命令. 设置了断 <BR>点的地方也用图形来显示. <BR> <BR> 你能在一个 Xterm 窗口里键入下面的命令来运行它: <BR>xxgdb <BR> 你能用 gdb 里任何有效的命令行选项来初始化 xxgdb . 此外 xxgdb 也有一 <BR>些特有的命令行选项, 表 27.2 列出了这些选项. <BR> <BR>表 27.2. xxgdb 命令行选项. <BR> <BR> <BR>选 项 描 述 <BR>db_name 指定所用调试器的名字, 缺省是 gdb. <BR>db_prompt 指定调试器提示符, 缺省为 gdb. <BR>gdbinit 指定初始化 gdb 的命令文件的文件名, 缺省为 .gdbinit. <BR>nx 告诉 xxgdb 不执行 .gdbinit 文件. <BR>bigicon 使用大图标……
查看全文
发表于:2008-03-30 ┆
阅读(87)
┆
评论(0)
C 语言之一 内存使用
<DIV> <DIV class=tit> </DIV> <DIV class=date>2008-01-24 11:05</DIV> <TABLE style="TABLE-LAYOUT: fixed"> <TBODY> <TR> <TD> <DIV class=cnt id=blog_text> <P>问题:</P> <P> 有人写了一个将整数转换为字符串的函数:</P> <P>char *itoa (int n)<BR>{<BR> char retbuf[20];<BR> sprintf(retbuf, %d, n);<BR> return retbuf;<BR>}</P> <P> 如果我调用这个函数:char *str5 = itoa(5),str5会是什么结果呢?</P> <P> 答案分析:</P> <P> 答案是不确定,可以确定的是肯定不是我们想要的 “5”。</P> <P> retbuf定义在函数体中,是一个局部变量,它的内存空间位于栈(stack)中的某个位置,其作用范围也仅限于在itoa()这个函数中。当itoa()函数退出时,retbuf在调用栈中的内容将被收回,这时,这块内存地址可能存放别的内容。因此将retbuf这个局部变量返回给调用者是达不到预期的目的的。</P> <P> 那么如何解决这个问题呢,不用担心,方法不但有,而且还不止一个,下面就来阐述三种能解决这个问题的办法:</P> <P> 1)、在itoa()函数内部定义一个static char retbuf[20],根据静态变量的特性,我们知道,这可以保证函数返回后……
查看全文
发表于:2008-03-30 ┆
阅读(120)
┆
评论(0)
C 语言之二 底层操作
<DIV> <DIV class=tit> </DIV> <DIV class=date>2008-01-24 11:05</DIV> <TABLE style="TABLE-LAYOUT: fixed"> <TBODY> <TR> <TD> <DIV class=cnt id=blog_text> <P>C语言的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的实际存储模型,很好的达到了对机器的映射,这是C/C++适合做底层开发的主要原因,另外,C语言适合做底层开发还有另外一个原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。</P> <P> 下面结合问题分别进行阐述。</P> <P> 问题:移位操作</P> <P> 在运用移位操作符时,有两个问题必须要清楚:</P> <P> (1)、在右移操作中,腾空位是填 0 还是符号位;</P> <P> (2)、什么数可以作移位的位数。</P> <P> 答案与分析:</P> <P> ">>"和"<<"是指将变量中的每一位向右或向左移动, 其通常形式为:</P> <P> 右移: 变量名>>移位的位数</P> <P> 左移: 变量名<<移位的位数</P> <P> 经过移位后, 一端的位被"挤掉",而另一端空出的位以0 填补,在C语言中的移位不是循环移动的。</P> <P> (1) 第一个问题的答案很简单,但要根据不同的情况而定。如果被移……
查看全文
发表于:2008-03-30 ┆
阅读(99)
┆
评论(0)
C 语言之三 声明的语法(转)
<DIV> <DIV class=tit> </DIV> <DIV class=date>2008-01-24 11:07</DIV> <TABLE style="TABLE-LAYOUT: fixed"> <TBODY> <TR> <TD> <DIV class=cnt id=blog_text>在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。<BR><STRONG><BR> 问题:声明与函数</STRONG> <BR><BR> 有一段程序存储在起始地址为0的一段内存上,如果我们想要调用这段程序,请问该如何去做? <BR><BR> <STRONG>答案</STRONG><BR><BR> 答案是(*(void (*)( ) )0)( )。看起来确实令人头大,那好,让我们知难而上,从两个不同的途径来详细分析这个问题。 <BR><BR><STRONG> 答案分析:从尾到头<BR><BR></STRONG> 首先,最基本的函数声明:void function (paramList);<BR><BR> 最基本的函数调用:function(paramList);<BR><BR> 鉴于问题中的函数没有参数,函数调用可简化为 function();<BR><BR> 其次,根据问题描述,可以知道0是这个函数的入口地址,也就是说,0是一个函数的指针。使用函数指针的函数声明形式是:void (*……
查看全文
发表于:2008-03-30 ┆
阅读(96)
┆
评论(0)
C 语言之四 编译器(转)
<DIV> <DIV class=tit> </DIV> <DIV class=date>2008-01-24 11:09</DIV> <TABLE style="TABLE-LAYOUT: fixed"> <TBODY> <TR> <TD> <DIV class=cnt id=blog_text> <P><BR>基本解释 <BR>本节主要探讨C编译器下面两方面的特点所引发的一系列常见的编程问题。 <BR>对C文件进行分别编译:<BR>C程序通常由几个小程序(.c文件)组成,编译器将这几个小程序分别编译,然后通过链接程序将它们组合在一起形成一个目标代码。由于编译器每次只能编译一个文件,因此它不能立即检查需要几个源文件配合才能发现的错误。 <BR>对函数的参数和返回值建立临时变量<BR>C编译器会对函数的参数建立临时参数,也可能会对函数的返回值隐含传递一个指针。因为这些临时变量的隐含性存在,使得在某些情况下,特别是有指针存在的时候,会引发一系列的问题。 <BR>C文件中所包含的头文件会和C语言一同编译</P> <P>C语言中被包含的头文件是和.c文件一起编译的,头文件中的问题会反映到.c文件的编译中。 <BR> 问题:C文件的分别编译</P> <P> 我有一个数组a定义在f1.c中,但是我想在f2.c中计算它的元素个数,用sizeof可以达到这个目的吗?</P> <P> 答案与分析:</P> <P> 答案是否……
查看全文
发表于:2008-03-30 ┆
阅读(109)
┆
评论(0)
C 语言之五 指针 数组 函数(转)
<DIV> <DIV class=tit> </DIV> <DIV class=date>2008-01-24 11:10</DIV> <TABLE style="TABLE-LAYOUT: fixed"> <TBODY> <TR> <TD> <DIV class=cnt id=blog_text> <P><BR>基本解释</P> <P> 1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。</P> <P> 2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。</P> <P> 3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。</P> <P> 问题:指针与数组</P> <P> 听说char a[]与char *a是一致的,是不是这样呢?</P> <P> 答案与分析:</P> <P> 指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:</P> <P>char a[] = Hi, pig!;<BR>char *p = Hi,……
查看全文
发表于:2008-03-30 ┆
阅读(113)
┆
评论(0)
C 语言之六 可变参数(转)
<DIV> <DIV class=tit> </DIV> <DIV class=date>2008-01-24 11:12</DIV> <TABLE style="TABLE-LAYOUT: fixed"> <TBODY> <TR> <TD> <DIV class=cnt id=blog_text> <P><BR>概述</P> <P> C语言中有一种长度不确定的参数,形如:"…",它主要用在参数个数不确定的函数中,我们最容易想到的例子是printf函数。</P> <P> 原型:</P> <P>int printf( const char *format [, argument]... );</P> <P> 使用例:</P> <P>printf("Enjoy yourself everyday!\n");<BR>printf("The value is %d!\n", value);</P> <P> 这种可变参数可以说是C语言一个比较难理解的部分,这里会由几个问题引发一些对它的分析。</P> <P> 注意:在C++中有函数重载(overload)可以用来区别不同函数参数的调用,但它还是不能表示任意数量的函数参数。</P> <P> 问题:printf的实现</P> <P> 请问,如何自己实现printf函数,如何处理其中的可变参数问题? 答案与分析:</P> <P> 在标准C语言中定义了一个头文件<stdarg.h>专门用来对付可变参数列表,它包含了一组宏,和一个va_list的typedef声明。一个典型实现如下:</P> <P>typedef char* va_list;<BR>#define v……
查看全文
发表于:2008-03-30 ┆
阅读(101)
┆
评论(0)
深入分析 Linux 内核链表(组图)
<DIV> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <TBODY> <TR> <TD align=middle bgColor=#bbf0ff><FONT style="FONT-SIZE: 14pt" color=#000066><B></B></FONT></TD> <TR> <TD> <TABLE style="BORDER-COLLAPSE: collapse" borderColor=#bbf0ff cellSpacing=1 cellPadding=0 width="100%" border=1> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width=650 border=0> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width=650> <DIV id=art style="MARGIN: 15px"> <DIV> <P>本文详细分析了 2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。 </P> <P>一、 链表数据结构简介 </P> <P>链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,……
查看全文
发表于:2008-03-30 ┆
阅读(121)
┆
评论(0)
关于指针与函数的几点小结
<DIV> <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <TBODY> <TR> <TD align=middle bgColor=#bbf0ff></TD> <TR> <TD> <TABLE style="BORDER-COLLAPSE: collapse" borderColor=#bbf0ff cellSpacing=1 cellPadding=0 width="100%" border=1> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width=650 border=0> <TBODY> <TR> <TD align=middle> <TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width=650> <DIV id=art style="MARGIN: 15px"> <DIV></DIV> <DIV>这个文章讲的还不错.今天晚上好好实践一下.谢谢这个大狭的文章.</DIV> <DIV>心血来潮, 想对函数指针的几个用法小结一下, 都是平常容易见到的, 如果还有其它不觉的用法也请朋友们不吝赐教. <BR><BR>若有错误之处,还请指正. <BR><BR>1. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针……
查看全文
发表于:2008-03-30 ┆
阅读(78)
┆
评论(0)
几道经典C语言面试题
<br><br>一、预处理器(Preprocessor)<br>1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)<br>#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL <br>考点: <br>1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) <br>2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 <br>3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 <br>4).表达式中用到UL(表示无符号长整型)<br>2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。<br>#define MIN(A,B) ((A) <= (B) ? (A) : (B)) <br>这个测试是为下面的目的而设的: <br>1). 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性……
查看全文
发表于:2008-03-28 ┆
阅读(126)
┆
评论(0)
vivi开发笔记
<table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="96%"><tbody><tr><td colspan="3" align="center" bgcolor="#f3f3f3"><table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td align="center" height="25"><font style="font-size: 14pt;" color="#02368d"><b>vivi开发笔记【专辑】</b></font><br> </td></tr> <tr><td bgcolor="#d2dee2" height="1"><br></td></tr> <tr><td bgcolor="#ffffff" height="1"><br></td></tr> <tr><td align="center"> <table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody><tr><td width="100%"> <div id="art" width="100%" style="margin: 15px;"> <div> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;">文章说明:calmarrow(lqm)原创</p> <p style="margin: 5px; line-height……
查看全文
发表于:2008-03-22 ┆
阅读(193)
┆
评论(0)
Linux多线程 Linux多线程
<br>使用多线程的理由:<br>1.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众<br><br>多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工<br><br>作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空<br><br>间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所<br><br>花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需<br><br>要的时间.<br>2.线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要<br><br>进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方<br><br>便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程<br><br>的数据可以直接为其它线程所用,这不仅快捷,而且方便。<br>实例:<br>Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多<br><br>线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便<br><br>说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone(<br><br>)是Linux所特有的系统调用,它的使用方式类似fork.<br>#include <stdio.h&g……
查看全文
发表于:2008-03-22 ┆
阅读(133)
┆
评论(0)
big-endian and little-endian
<table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td align="center" height="25"><br> </td></tr> <tr><td bgcolor="#d2dee2" height="1"><br></td></tr> <tr><td bgcolor="#ffffff" height="1"><br></td></tr> <tr><td align="center"> <table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody><tr><td width="100%"> <div id="art" width="100%" style="margin: 15px;"> <div> <table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%;">文章说明:calmarrow(lqm)原创</p> <p style="margin: 5px; line-height: 150%;">文章引自:<a href="http://piaoxiang.cublog.cn/">http://piaoxiang.cublog.cn</a></p></td></tr></tbody></table></div> <div> </div> <div> 一个16位整数,由两个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存……
查看全文
发表于:2008-03-22 ┆
阅读(166)
┆
评论(0)