2012-3-17 周六
每周把一些很实用的工作日志保存下来,以便于后面的查用。如果同时能给大家带来点帮助,那我也就心满意足啦。
如果你喜欢本文,欢迎转载,但请注明出处。本文出自:http://blog.csdn.net/ok_wolf/article/details/7364537
1、虚拟机通过NAT上网
搞了这么久,虚拟机终于能够上网了,在其他都设置好之后,还是不能上网,原来在虚拟机设置中没有打开DHCP服务的选项,所以才搞了这么久。具体如下:
在命令行终端输入命令:#setup
进入网络设置里面,在DHCP前面按空格键选择DHCP,然后可以看到下面的IP地址设置那三行变灰了,这就意味着已经打开了DHCP了。
但是,还需要其他的设置,比如:Vmnet1和Vmnet8都要设置成自动获取IP地址,虚拟机的网络连接要设置为NAT。
参考网址:http://wenku.baidu.com/view/369bf2c658f5f61fb7366677.html
2、关于Jlink、Jtag、Nand Flash、Nor Flash等问题
Nand Flash 的容量一般比Nor Flash的大,一般的容量都有128M/256M/1G/2G的,而Nor Flash的容量比较小,一般的容量是2M的,Nor Flash的读写速度比Nand Flash的要快很多,并且价格也比Nand Flash要高。所以,现在买的ARM学习板,后面都没有Nor Flash了,而是采用了SD卡。(mini2440就有2M的Nor Flash,而tiny6410就是没有Nor Flash了,而是采用了SD卡)。
Nand Flash和Nor Flash的区别可以参考网址:
http://wenku.baidu.com/view/390275d376a20029bd642d81.html
http://mxpopstar.blog.163.com/blog/static/73764120081020113739760/
uboot的功能很强大,一般的功能都有:擦除Nand Flash中的数据,下载uboot的到nand flash中,下载内核文件,下载文件系统等等。另外还支持通过usb下载程序。如果是友善之臂公司的板子,那么所提供的supervivi也是很强大的。
但是,有一点,就是原先板子里面已经下载好了supervivi或者是uboot了。如果有nor flash的,里面就有这个bootloader了。如果没有nor flash,那么SD卡里面也要有uboot的,而如果没有呢,如果板子有uboot的话,那么就用Jlink或者Jtag工具烧写进uboot的,当然这个过程比较复杂,而且挺难配置的,现在上网查了一下,s3c2440以前的(包括s3c2440)都是提供了nor flash的,所以如果用Jlink或者Jtag烧写uboot进nor flash或者nand flash的,网上都有很多的资料,操作起来,还是比较容易的。而s3c2440以后的,没有提供nor flash了,只提供了SD卡,如果它的板子提供的uboot支持nand flash启动,但是用Jlink或者Jtag很难烧写进nand flash中,网上很难查找到相关的信息,因为大多数的做法都是通过SD卡把uboot烧写进nand flash中的,因为他们说s3c6410支持了从SD卡启动,而且这样的方法也很方便。如果是用Jlink或Jtag烧写uboot进nand flash的话,那就涉及到板子的配置文件问题。
在s3c2440中,用Jlink或Jtag烧写uboot进nor flash,是使用间接烧写的办法,这个方法在网上很流行,可以参阅网址:http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=3228953
大概的过程就是:Jlink提供了一个初始化cpu寄存器的文件,把这个文件先下载到nor flash或者nand flash中(烧写的地址也是有讲究的),这个文件在SDRAM中运行,之后就再下载uboot的,那么原先的这个init.bin初始化文件就回帮你搬运代码,把uboot的代码搬运到nor flash或者nand flash中。
前面也说了,如果是s3c6410的板子,使用Jlink或者Jtag烧写uboot进nand flash是困难的,其困难之处在于:1、s3c6410的板子,使用的是DDR RAM,而这跟mini2440使用的SDRAM不一样。DDR RAM是传统的SDRAM更新版。2、即使那个DDR RAM与SDRAM类似,但是它们的规格容量大小不一样,所以,要配置适合DDR RAM的文件,还是比较困难的,这就需要了解很多的东西,包括存储芯片分区的问题。
还有一个问题,就是关于Jlink和Jtag。一般来说,大多数调试裸机程序都是使用Jlink(至于为什么,我也不知道),但是大多数板子所提供的接口都是Jtag。Jlink的价格大概在于70-120元之间,而Jtag仿真器,有进口的也有国产的,而且价格相差比较大。一般来说,越到高级的板子(比如tiny6410,ARM11的板子),拿来做裸机程序的几率很小,所以现在很多关于裸机调试的教程都没有了,只是提及一下而已,并没有详细说明。
如果你喜欢本文,欢迎转载,但请注明出处。本文出自:http://blog.csdn.net/ok_wolf/article/details/7364537
2012-3-23 周五 9:07
1、关于Qt界面标题显示的问题
之前弄好好久也没有把应该显示的标题显示出来,而且在X86上仿真的生活,是可以仿真出来的。但是下载到目标板上以后就显示不出来了。由于在X86上设置得Qt运行环境跟目标板上的大致是一样的,所以,很可能原因就出在了目标板上的设置问题。
查了很久,终于发现了原因。
其原因在于,在/usr/bin/qtconfig文件中,有这么一条语句:
export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0"
出错的原因就在于把字体设置得太大了,虽然其他的字体可以正常显示,但是就是标题显示不出来。所以无意中,将其改为:
export QWS_DISPLAY="LinuxFb:mmWidth3:mmHeight4:0"
之后,标题就正常显示了。
QWS_DISPLAY的具体的意思我没有查,但是看这一条语句的表达式,就是跟设置字体的大小有关,包括宽度和高度。
2、关于串口的2、3、5线的问题。
(1)DB9和DB25的常用信号脚说明
DB9 | DB25
pin function name pin function name
1 数据载波检测 DCD 8 数据载波检测 DCD
2 接收数据 RXD 3 接收数据 RXD
3 发送数据 TXD 2 发送数据 TXD
4 数据终端准备 DTR 20 数据终端准备 DTR
5 信号地 GND 7 信号地 GND
6数据设备准备好DSR 6 数据设备准备好 DSR
7 请求发送 RTS 4 请求发送 RTS
8 清除发送 CTS 5 清除发送 CTS
9 振铃指示 RI 22 振铃指示 RI
我们重点关注的是:在电脑的串口上,一般来说,在DB9中,2-接收数据(RXD)、3-发送数据(TXD),5-地线(SG)
在DB25中,3-接收数据,2-发送数据,5-地线。参考网址:http://wenku.baidu.com/view/5c170c6925c52cc58bd6be6e.html
目前使用了三中板子,分别是mini2440,TX-2440A和FPGA的板子,有了很大的发现。串口分为公头和母头。当公头和母头相连接时,都是2-2,3-3,5-5的,也就是说发送对着发送,接收对着接收。但要注意的是,当要使板子跟电脑进行串口通信时,必须是2-3,3-2,5-5进行连接的。一般所用的就是直连线。所以,有些板子的串口就做好了。也就是跟电脑的串口相反,就是2-发送数据(TXD),3-接收数据(RXD)。而mini2440和FPGA开发板就是这种类型的板子。但是,TX-2440A的串口定义跟电脑的串口定义一样,是2-接收数据(RXD),3-发送数据(TXD),所以,如果要使TX-2440A与电脑串口进行串口通信,必须使用串口交叉线,而TX-2440A所使用的正是串口交叉线。
还有一个问题,就是mini2440与FPGA的串口通信连接的问题。
mini2440:2-发送数据(TXD),3-接收数据(RXD),5-信号地线
FPGA: 2-发送数据(TXD), 3-接收数据(RXD),5-信号地线
这两者如果需要连接,那么就必须使用串口交叉线。如果没有串口交叉线,可以自己手工制作一条,就是通过一条串口直连线进行改造,把2跟3线对着接起来。
TX-2440A:2-接收数据(RXD),3-发送数据(TXD),5-信号地线
FPGA: 2-发送数据(TXD), 3-接收数据(RXD),5-信号地线
那么,这两者的连线通过一个串口直连线连接起来即可进行串口通信了。
2012-3-30 周五 11:03
1、预定义符号的使用
预处理器定义了5个符号,分别是:__FILE__、__LINE__、__DATE__、__TIME__、__STDC__。
C语言编译器的预定义符号
__LINE__当前(源代码文件)行号 [整数]
__FILE__当前正在编译的文件的文件名 [字符串]
__DATE__当前日期,以“月月 日日 年年年年”的形式给出 [字符串]
__TIME__当前时间,以“HH:mm:ss”的格式给出 [字符串]
__STDC__如果编译器符合ANSI C标准,该宏为1,否则为0
__STDC_HOSTED__如果实现了所有C标准库,该宏为1,否则为0
__STDC_VERSION__被定义为199901L(不同编译器可能不一样,比如我用的gcc里就没有这个预定义符号)
注:这些预定义符号的首尾为两个下划线,如果是两个单词,中间以一个下划线连接。
如果在源代码中使用了这些符号,它们会在预处理时被转换(使用gcc编译器的 -E 选项可以看到替换后的值)
C标准里还在每个函数内预定义了一个标志符: __func__它被定义为 static const char __func__[]="function-name";即不能在程序内对__func__赋值,也不能改变它所指向的字符串(函数名),否则报编译错误注:__func__是个标志符,它在预处理阶段不被替换,所以使用gcc -E 是看不到任何效果的。
例:
test.c |
2、关于C头文件、CPP源文件调用的问题
出现类似于这样的问题:error LNK2001: unresolved external symbol "int __cdecl add(int,int)" ([email=?add@@YAHHH@Z]?add@@YAHHH@Z[/email])
这是因为C函数和C++函数对函数名的命名问题造成的。C中函数编译后命名会在函数名前加以"_",比如add函数编译成obj文件时的实际命名为_add,而c++命名则不同,为了实现函数重载同样的函数名add因参数的不同会被编译成不同的名字。
那么解决的办法有两个:
第一种方法:不对C头文件进行修改,只在引用C头文件的CPP源文件中,加上以下语句即可:
extern “C”
{
#include “XX.h”
}
解释:extern “C”表示使用C函数编译的方法来解释这个XX.h头文件
注意“C”要大写。
第二种方法:修改所引用的头文件。具体如下:
#ifndef _XX_H
#define _XX_H
#ifdef __cplusplus
extern “C”{
#endif
(这里是XX.h头文件的内容)
#ifdef __cplusplus
}
#endif
#endif
说明:实际上这种方法跟第一种方法很类似的,只是换了一种形式。其实都是要加上“extern “C””来对C头文件进行按照C函数的方式进行解释。另外,“__cplusplus”的前面是两个“_”,而不是一个。这个标志是在编译C++的文件时生成的,而在编译C文件时根据没有生产这个标志,所以我们对C的头文件进行的修改就跟没有修改过一样。
其实,这种问题出现的根本原因是因为一个是C文件,一个是C++文件,其实C文件跟C++文件时很类似的,当然也可以把C文件直接通过修改后缀名来把它改为C++文件。这样,C++文件调用C++文件的头文件,就不会出现这种问题了。当然,这可能仅仅对一些小的函数文件起作用,其他的大型程序我没有尝试过。
3、关于模板分离的问题
按照我的理解,模板分离应该是指把函数的定义(也可以说是函数的原型)写在头文件XX.h中,而把函数的实现写在XX.c中。
但是,如果要使用XX.c应用的变量,那么该如果处理呢?
另外,VC++6.0好像不支持export这个关键字。
这个问题的参考资料网址:
http://topic.csdn.net/u/20080910/10/5546c282-34a0-4126-94db-8ed553c4dfb2.html
http://topic.csdn.net/t/20041009/06/3435646.html
http://blog.163.com/zhangqj_2002/blog/static/534807342007111010120305/
4、关于断言assert的位置放置问题
发现如果按照下面这么写,编译不通过的。
assert(new_size > top_element);
int i;
STACK_TYPE *old_stack;
不知道具体是什么原因,估计是因为如果断言发在前面,如果出错了,程序就终止了,也就没法定义变量了。解决的办法是把断言放在定义变量之后。
如下:
int i;
STACK_TYPE *old_stack;
assert(new_size > top_element);
5、问题:Cannot open the message catalog "man" for locale "zh_CN.GB2312"
资料参考网址:
http://www.cnblogs.com/pbss/articles/2024439.html
解决办法:
修改/etc/profile文件,在文件最后加上:unset MANPATH
成这个问题应该是系统更新时候没有更新/etc/profile.pacnew内容到新的/etc/profile内容里去,只能手动改。
6、关于tar解压.tar.gz和.tar.bz2压缩包的命令
解压.tar.gz的压缩包
此压缩包是由gzip命令进行压缩的。打包压缩命令为:tar -zcvf test.tar.gz test
解压命令为:tar -zxvf test.tar.gz
解析:-z 代表使用gzip命令,-c表示打包,-v表示显示命令执行的过程,
-f表示后面要接的文件名
解压.tar.bz2的压缩包
此压缩包是由bzip2命令进行压缩的。打包压缩命令为:tar -jcvf test.tar.bz2 test
解压命令为:tar -jxvf test.tar.bz2