日誌記錄(2012.3)

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
int main(){
printf("%s %s\n",__FILE__,__func__);
return 0;
}
輸出: test.c main

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章