av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

Linux下串口調試的全過程及源代碼(linux串口調試源代碼)

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

新巴爾虎左網站建設公司創(chuàng)新互聯公司,新巴爾虎左網站設計制作,有大型網站制作公司豐富經驗。已為新巴爾虎左千余家提供企業(yè)網站建設服務。企業(yè)網站搭建\外貿營銷網站建設要多少錢,請找那個售后服務好的新巴爾虎左做網站的公司定做!

1. 準備工作

在進行串口調試之前,需要先準備一些工具和設備。需要一臺 Linux 機器以及一個串口轉 USB 線纜。需要安裝一些必要的軟件,如 minicom 等。需要連接串口轉 USB 線纜到要調試的硬件設備上。

2. 配置串口

在 Linux 環(huán)境下,串口配置分為兩部分:內核配置和用戶空間配置。內核配置主要是針對硬件的,而用戶空間配置則是針對軟件的。

2.1 內核配置

在進行內核配置之前,需要確定 CPU 架構。在我們的例子中,我們使用的是 x86 架構。接著,我們需要在內核配置文件中添加以下配置:

“`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

“`

以上配置表示啟用串口驅動,并開啟控制臺。其中,`CONFIG_SERIAL_8250_NR_UARTS` 表示更大串口數量,`CONFIG_SERIAL_8250_RUNTIME_UARTS` 表示當前使用的串口數量。`CONFIG_SERIAL_CORE_AMBA_PL011` 表示使用 PL011 串口控制器,這個需要根據硬件具體情況進行調整。

2.2 用戶空間配置

在用戶空間中,我們需要配置 minicom。在安裝 minicom 后,我們需要對其進行配置??梢酝ㄟ^以下命令進行配置:

“`bash

sudo minicom -s

“`

通過此命令,我們可以設置串口波特率、數據位、奇偶校驗位等參數。配置完成后,我們就可以使用 minicom 進行串口調試了。

3. 編寫串口調試程序

在實際開發(fā)中,我們經常需要編寫一些簡單的串口調試程序。下面是一個串口輸出 “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()` 函數進行串口配置,如設置波特率、數據位、奇偶校驗等。使用 `write()` 函數輸出 “Hello, world!”。

4.

相關問題拓展閱讀:

  • linux 怎么 在 驅動中 使用串口
  • linux kernel 沒有輸出信息 怎么調試
  • 哪里有LINUX下的串口調試工具

linux 怎么 在 驅動中 使用串口

Linux發(fā)行版自帶u to serial驅動,以模塊方式編譯驅動,在內核源握碰棚代碼目錄下運段則行Make MenuConfig選擇Devces

drivers–>USB seupport–> USB Serial Converter support

–> USB driver for G and CDMA modems & USB Generic

Serial Driver,保存退出。運行make

linux kernel 沒有輸出信息 怎么調試

內核中的bug也是多種多樣的。它們的產生有無數的原喚運因,同時表象也變化多端。從隱藏在源代碼中的錯誤到展現在目擊者面前的bug,其發(fā)作往往是猜簡一系列和兆梁連鎖反應的事件才可能出發(fā)的。雖然內核調試有一定的困難,但是通過你的努力和理解,說不定你會喜歡上這樣的挑戰(zhàn)。

最近工作在調試u虛擬串口,讓其作為kernel啟動的調試串口老埋,以及user空間的輸入輸出控制臺。

利用這個機會,學習下printk如何選擇往哪個console輸出以及user空間下控制臺如何選擇,記錄與此,與大家共享,也尺含絕方便自己以后翻閱。

Kernel版本號:3.4.55

依照我的思路(還是時間順序)分了4部分,指定kernel調試console , kernel下printk console的選擇 ,kernel下console的注冊,user空間console的選陵姿擇。

一 指定kernel調試console

首先看kernel啟動時如何獲取和處理指定的console參數。

kernel的啟動參數cmdline可以指定調試console,如指定‘console=ttyS0,115200’,

kernel如何解析cmdline,我之前寫了一篇博文如下:

根據之前的分析,cmdline中有console=xxx,start_kernel中parse_args遍歷.init.setup段所有obs_kernel_param。

kernel/printk.c中注冊了‘console=’的解析函數console_setup(注冊了obs_kernel_param),所以匹配成功,會調用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利用結構體數組console_cmdline,最多可支持8個cmdline傳入的console參數。

__add_preferred_console將name idx options保存到數組下一個成員console_cmdline結構體中,如果數組中已有重名,則不添加,并置selected_console為最新添加的console_cmdline的下標號。

比如cmdline中有“console=ttyS0,console=ttyS1,9600”

則在console_cmdline數組中console_cmdline代表ttyS0,console_cmdline代表ttyS1,而selected_console=1.

二 kernel下printk console的選擇

kernel下調試信息是通過printk輸出,如果要kernel正常打印,則需要搞明白printk怎么選擇輸出的設備。

關于printk的實現原理,我在剛工作的時候寫過一篇博文,kernel版本是2.6.21的,但是原理還是一致的,可供參考:

printk首先將輸出內容添加到一個kernel緩沖區(qū)中,叫l(wèi)og_buf,log_buf相關代碼如下:

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內容會一直存在log_buf中,log_buf滿了之后則會從頭在開始存,覆蓋掉原來的數據。

根據printk的實現原理,printk最后調用console_unlock實現log_buf數據刷出到指定設備。

這里先不關心printk如何處理log buf數據(比如添加內容級別),只關心printk如何一步步找到指定的輸出設備,根據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,則調用與exclusive_console一致console的write,

如果exclusive_console為NULL,則調用所有ENABLE的console的write方法將log buf中start到end的內容發(fā)出。

可以看出,execlusive_console來指定printk輸出唯一console,如果未指定,則向所有enable的console寫。

默認情況下execlusive_console=NULL,所以printk默認是向所有enable的console寫!

只有一種情況是指定execlusive_console,就是在console注冊時,下面會講到。

到這里就很明了了,kernel下每次printk打印,首先存log_buf,然后遍歷console_drivers,找到合適console(execlusive_console或所有enable的),刷出log。

哪里有LINUX下的串口調試工具

minicom

minicom 是一款啟動速度快,功能強大的串口終端調試工具,當然缺點就是純字符界面,沒有圖形界面的調試工具看起來直觀方便,但是它功能十分強大,并且在一些沒有屏幕的嵌入式主板上運行頗有用處。下面給出具體的安裝與使用教程:

安裝:apt-get install minicom

使用流程:

安裝完畢后通過命令 “minicom” 運行軟件,首頁已經給了使用說明,Minicom 使用經常遇到三個鍵的組合操作,如 “CTRL-A Z”,這表示先同時按下 CTRL 和 “A”(不區(qū)分大寫),然后松開此二鍵再按下 “Z”。按照此方法,打開幫助說明:

可以看到有很多功能,這里只進行初步演示坦梁,按下 “O” 進入配置頁,如下:

選擇 “Serial port setup” 選項,然后按回車進入串口設置頁,如下:

根據我們系統中的實際串口設備名更改成以下設置,如下圖所示:

設置好以后知信春返回到上一級,選擇 “Save setup as dfl” 進行保存即可,然后 Exit。確保串口設備已經接入后,重新運行 minicom 軟件,就可以進行串口數據的收發(fā)了,如果沒有發(fā)現設置的串口設備 minicom 運行會提示出錯,如下所示:

如果需要修改設置,那么需要運行 “minicom -s” 重新進行設置。搭耐在配置正確的情況下,連接我的 Openwrt 開發(fā)板進行通訊演示:

關于linux 串口調試 源代碼的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。

成都創(chuàng)新互聯科技有限公司,是一家專注于互聯網、IDC服務、應用軟件開發(fā)、網站建設推廣的公司,為客戶提供互聯網基礎服務!
創(chuàng)新互聯(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務器和獨立服務器。創(chuàng)新互聯成都老牌IDC服務商,專注四川成都IDC機房服務器托管/機柜租用。為您精選優(yōu)質idc數據中心機房租用、服務器托管、機柜租賃、大帶寬租用,可選線路電信、移動、聯通等。


網站題目:Linux下串口調試的全過程及源代碼(linux串口調試源代碼)
文章鏈接:http://uogjgqi.cn/article/cocjpoi.html
掃二維碼與項目經理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流