新聞中心
串口調(diào)試是開發(fā)人員在硬件調(diào)試中經(jīng)常遇到的問題之一。在 Linux 環(huán)境下,串口調(diào)試也是一項(xiàng)復(fù)雜的任務(wù)。本文將介紹在 Linux 環(huán)境下串口調(diào)試的全過程,并提供源代碼以供參考。

新巴爾虎左網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,新巴爾虎左網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為新巴爾虎左千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的新巴爾虎左做網(wǎng)站的公司定做!
1. 準(zhǔn)備工作
在進(jìn)行串口調(diào)試之前,需要先準(zhǔn)備一些工具和設(shè)備。需要一臺(tái) Linux 機(jī)器以及一個(gè)串口轉(zhuǎn) USB 線纜。需要安裝一些必要的軟件,如 minicom 等。需要連接串口轉(zhuǎn) USB 線纜到要調(diào)試的硬件設(shè)備上。
2. 配置串口
在 Linux 環(huán)境下,串口配置分為兩部分:內(nèi)核配置和用戶空間配置。內(nèi)核配置主要是針對(duì)硬件的,而用戶空間配置則是針對(duì)軟件的。
2.1 內(nèi)核配置
在進(jìn)行內(nèi)核配置之前,需要確定 CPU 架構(gòu)。在我們的例子中,我們使用的是 x86 架構(gòu)。接著,我們需要在內(nèi)核配置文件中添加以下配置:
“`c
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_UARTLITE=y
CONFIG_SERIAL_CORE_IRQ=y
CONFIG_SERIAL_CORE_AMBA_PL011=y
“`
以上配置表示啟用串口驅(qū)動(dòng),并開啟控制臺(tái)。其中,`CONFIG_SERIAL_8250_NR_UARTS` 表示更大串口數(shù)量,`CONFIG_SERIAL_8250_RUNTIME_UARTS` 表示當(dāng)前使用的串口數(shù)量。`CONFIG_SERIAL_CORE_AMBA_PL011` 表示使用 PL011 串口控制器,這個(gè)需要根據(jù)硬件具體情況進(jìn)行調(diào)整。
2.2 用戶空間配置
在用戶空間中,我們需要配置 minicom。在安裝 minicom 后,我們需要對(duì)其進(jìn)行配置??梢酝ㄟ^以下命令進(jìn)行配置:
“`bash
sudo minicom -s
“`
通過此命令,我們可以設(shè)置串口波特率、數(shù)據(jù)位、奇偶校驗(yàn)位等參數(shù)。配置完成后,我們就可以使用 minicom 進(jìn)行串口調(diào)試了。
3. 編寫串口調(diào)試程序
在實(shí)際開發(fā)中,我們經(jīng)常需要編寫一些簡(jiǎn)單的串口調(diào)試程序。下面是一個(gè)串口輸出 “Hello, world!” 的例子:
“`c
#include
#include
#include
int mn()
{
int fd;
struct termios options;
char buf[] = “Hello, world!\n”;
fd = open(“/dev/ttyUSB0”, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd
{
perror(“open”);
return -1;
}
fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
options.c_cflag &= ~CSTOPB;
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
tcsetattr(fd, TCSANOW, &options);
write(fd, buf, sizeof(buf));
close(fd);
return 0;
}
“`
以上代碼首先打開串口 `/dev/ttyUSB0`,之后通過 `tcsetattr()` 函數(shù)進(jìn)行串口配置,如設(shè)置波特率、數(shù)據(jù)位、奇偶校驗(yàn)等。使用 `write()` 函數(shù)輸出 “Hello, world!”。
4.
相關(guān)問題拓展閱讀:
- linux 怎么 在 驅(qū)動(dòng)中 使用串口
- linux kernel 沒有輸出信息 怎么調(diào)試
- 哪里有LINUX下的串口調(diào)試工具
linux 怎么 在 驅(qū)動(dòng)中 使用串口
Linux發(fā)行版自帶u to serial驅(qū)動(dòng),以模塊方式編譯驅(qū)動(dòng),在內(nèi)核源握碰棚代碼目錄下運(yùn)段則行Make MenuConfig選擇Devces
drivers–>USB seupport–> USB Serial Converter support
–> USB driver for G and CDMA modems & USB Generic
Serial Driver,保存退出。運(yùn)行make
linux kernel 沒有輸出信息 怎么調(diào)試
內(nèi)核中的bug也是多種多樣的。它們的產(chǎn)生有無數(shù)的原喚運(yùn)因,同時(shí)表象也變化多端。從隱藏在源代碼中的錯(cuò)誤到展現(xiàn)在目擊者面前的bug,其發(fā)作往往是猜簡(jiǎn)一系列和兆梁連鎖反應(yīng)的事件才可能出發(fā)的。雖然內(nèi)核調(diào)試有一定的困難,但是通過你的努力和理解,說不定你會(huì)喜歡上這樣的挑戰(zhàn)。
最近工作在調(diào)試u虛擬串口,讓其作為kernel啟動(dòng)的調(diào)試串口老埋,以及user空間的輸入輸出控制臺(tái)。
利用這個(gè)機(jī)會(huì),學(xué)習(xí)下printk如何選擇往哪個(gè)console輸出以及user空間下控制臺(tái)如何選擇,記錄與此,與大家共享,也尺含絕方便自己以后翻閱。
Kernel版本號(hào):3.4.55
依照我的思路(還是時(shí)間順序)分了4部分,指定kernel調(diào)試console , kernel下printk console的選擇 ,kernel下console的注冊(cè),user空間console的選陵姿擇。
一 指定kernel調(diào)試console
首先看kernel啟動(dòng)時(shí)如何獲取和處理指定的console參數(shù)。
kernel的啟動(dòng)參數(shù)cmdline可以指定調(diào)試console,如指定‘console=ttyS0,115200’,
kernel如何解析cmdline,我之前寫了一篇博文如下:
根據(jù)之前的分析,cmdline中有console=xxx,start_kernel中parse_args遍歷.init.setup段所有obs_kernel_param。
kernel/printk.c中注冊(cè)了‘console=’的解析函數(shù)console_setup(注冊(cè)了obs_kernel_param),所以匹配成功,會(huì)調(diào)用console_setup來解析,如下:
view plain copy
static int __init console_setup(char *str)
{
char buf.name) + 4>; /* 4 for index */
char *s, *options, *brl_options = NULL;
int idx;
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
if (!memcmp(str, “brl,”, 4)) {
brl_options = “”;
str += 4;
} else if (!memcmp(str, “brl=”, 4)) {
brl_options = str + 4;
str = strchr(brl_options, ‘,’);
if (!str) {
printk(KERN_ERR “need port name after brl=\n”);
return 1;
}
*(str++) = 0;
}
#endif
/*
* Decode str into name, index, options.
*/
if (str >= ‘0’ && str = ‘0’ && *s name, name, sizeof(c->name));
c->options = options;
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
c->brl_options = brl_options;
#endif
c->index = idx;
return 0;
}
kernel利用結(jié)構(gòu)體數(shù)組console_cmdline,最多可支持8個(gè)cmdline傳入的console參數(shù)。
__add_preferred_console將name idx options保存到數(shù)組下一個(gè)成員console_cmdline結(jié)構(gòu)體中,如果數(shù)組中已有重名,則不添加,并置selected_console為最新添加的console_cmdline的下標(biāo)號(hào)。
比如cmdline中有“console=ttyS0,console=ttyS1,9600”
則在console_cmdline數(shù)組中console_cmdline代表ttyS0,console_cmdline代表ttyS1,而selected_console=1.
二 kernel下printk console的選擇
kernel下調(diào)試信息是通過printk輸出,如果要kernel正常打印,則需要搞明白printk怎么選擇輸出的設(shè)備。
關(guān)于printk的實(shí)現(xiàn)原理,我在剛工作的時(shí)候?qū)戇^一篇博文,kernel版本是2.6.21的,但是原理還是一致的,可供參考:
printk首先將輸出內(nèi)容添加到一個(gè)kernel緩沖區(qū)中,叫l(wèi)og_buf,log_buf相關(guān)代碼如下:
view plain copy
#define MAX_CMDLINECONSOLES 8
static struct console_cmdline console_cmdline;
static int selected_console = -1;
static int preferred_console = -1;
int console_set_on_cmdline;
EXPORT_SYMBOL(console_set_on_cmdline);
/* Flag: console code may call schedule() */
static int console_may_schedule;
#ifdef CONFIG_PRINTK
static char __log_buf;
static char *log_buf = __log_buf;
static int log_buf_len = __LOG_BUF_LEN;
static unsigned logged_chars; /* Number of chars produced since last read+clear operation */
static int saved_console_loglevel = -1;
log_buf的大小由kernel menuconfig配置,我配置的CONFIG_LOG_BUF_SHIFT為17,則log_buf為128k。
printk內(nèi)容會(huì)一直存在log_buf中,log_buf滿了之后則會(huì)從頭在開始存,覆蓋掉原來的數(shù)據(jù)。
根據(jù)printk的實(shí)現(xiàn)原理,printk最后調(diào)用console_unlock實(shí)現(xiàn)log_buf數(shù)據(jù)刷出到指定設(shè)備。
這里先不關(guān)心printk如何處理log buf數(shù)據(jù)(比如添加內(nèi)容級(jí)別),只關(guān)心printk如何一步步找到指定的輸出設(shè)備,根據(jù)printk.c代碼,可以找到如下線索。
printk->vprintk->console_unlock->call_console_drivers->_call_console_drivers->_call_console_drivers->__call_console_drivers
看線索更底層__call_console_drivers代碼。如下:
view plain copy
/*
* Call the console drivers on a range of log_buf
*/
static void __call_console_drivers(unsigned start, unsigned end)
{
struct console *con;
for_each_console(con) {
if (exclusive_console && con != exclusive_console)
continue;
if ((con->flags & CON_ENABLED) && con->write &&
(cpu_online(p_processor_id()) ||
(con->flags & CON_ANYTIME)))
con->write(con, &LOG_BUF(start), end – start);
}
}
for_each_console定義如下:
view plain copy
/*
* for_each_console() allows you to iterate on each console
*/
#define for_each_console(con) \
for (con = console_drivers; con != NULL; con = con->next)
遍歷console_drivers鏈表所有console struct,如果有exclusive_console,則調(diào)用與exclusive_console一致console的write,
如果exclusive_console為NULL,則調(diào)用所有ENABLE的console的write方法將log buf中start到end的內(nèi)容發(fā)出。
可以看出,execlusive_console來指定printk輸出唯一console,如果未指定,則向所有enable的console寫。
默認(rèn)情況下execlusive_console=NULL,所以printk默認(rèn)是向所有enable的console寫!
只有一種情況是指定execlusive_console,就是在console注冊(cè)時(shí),下面會(huì)講到。
到這里就很明了了,kernel下每次printk打印,首先存log_buf,然后遍歷console_drivers,找到合適console(execlusive_console或所有enable的),刷出log。
哪里有LINUX下的串口調(diào)試工具
minicom
minicom 是一款啟動(dòng)速度快,功能強(qiáng)大的串口終端調(diào)試工具,當(dāng)然缺點(diǎn)就是純字符界面,沒有圖形界面的調(diào)試工具看起來直觀方便,但是它功能十分強(qiáng)大,并且在一些沒有屏幕的嵌入式主板上運(yùn)行頗有用處。下面給出具體的安裝與使用教程:
安裝:apt-get install minicom
使用流程:
安裝完畢后通過命令 “minicom” 運(yùn)行軟件,首頁(yè)已經(jīng)給了使用說明,Minicom 使用經(jīng)常遇到三個(gè)鍵的組合操作,如 “CTRL-A Z”,這表示先同時(shí)按下 CTRL 和 “A”(不區(qū)分大寫),然后松開此二鍵再按下 “Z”。按照此方法,打開幫助說明:
可以看到有很多功能,這里只進(jìn)行初步演示坦梁,按下 “O” 進(jìn)入配置頁(yè),如下:
選擇 “Serial port setup” 選項(xiàng),然后按回車進(jìn)入串口設(shè)置頁(yè),如下:
根據(jù)我們系統(tǒng)中的實(shí)際串口設(shè)備名更改成以下設(shè)置,如下圖所示:
設(shè)置好以后知信春返回到上一級(jí),選擇 “Save setup as dfl” 進(jìn)行保存即可,然后 Exit。確保串口設(shè)備已經(jīng)接入后,重新運(yùn)行 minicom 軟件,就可以進(jìn)行串口數(shù)據(jù)的收發(fā)了,如果沒有發(fā)現(xiàn)設(shè)置的串口設(shè)備 minicom 運(yùn)行會(huì)提示出錯(cuò),如下所示:
如果需要修改設(shè)置,那么需要運(yùn)行 “minicom -s” 重新進(jìn)行設(shè)置。搭耐在配置正確的情況下,連接我的 Openwrt 開發(fā)板進(jìn)行通訊演示:
關(guān)于linux 串口調(diào)試 源代碼的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。
新聞名稱:Linux下串口調(diào)試的全過程及源代碼(linux串口調(diào)試源代碼)
路徑分享:http://www.dlmjj.cn/article/cocjpoi.html


咨詢
建站咨詢
