ubuntu下Nuttx OS調試環(huán)境搭建--Apple的學習筆記

一,前言

最近看技術blog,發(fā)現(xiàn)好多免費的OS,其中nuttx引起了我的注意,主要原因是它是RTOS,但是用的API是posix的,我簡單理解就是在linux和rtos的結合體。這樣在linux上的應用code要移植到單片機,那么就可以用nuttx。然后看到nuttx被國產某家買斷后變成apache nuttx一直在維護,它擁有開源飛控系統(tǒng)PX4中。除了圖形圖形,os也是我感興趣的內容。所以近期又會開展一輪os相關的復習和再學習。我還看到鴻蒙os的虛擬文件系統(tǒng)借用的就是nuttx的虛擬文件系統(tǒng),不過說此文件系統(tǒng)性能不太好。

二,nuttx交叉編譯調試環(huán)境搭建

nuttx最適配的是linux環(huán)境,我也在window安裝了cygwin去編譯,貌似不太好用。所以在虛擬機上安裝了ubuntu20.04,然后按nuttx官網(wǎng)help搭建了編譯調試環(huán)境。但是最后一步OpenOCD出錯,最后自己研究了下,連接完stlink后需要使用命令
openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f target/stm32f4x.cfg
然后就可以看到串口輸出"nsh>"了。參考官網(wǎng)的具體步驟如下:

A,ubuntu20.04環(huán)境創(chuàng)建
我先安裝了ubuntu20.04在虛擬機中。然后mnt中為空,無法共享文件。網(wǎng)上查了解決方案。
在進入mnt目錄,mkdir hgfs創(chuàng)建文件夾,執(zhí)行vmhgfs-fuse /mnt/hgfs。然后cd hgfs就可以看到設置的共享文件夾咯~

B,安裝編譯工具鏈
按nuttx.apache.org官網(wǎng)的help,安裝需要的工具。
1.sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
2.apt install kconfig-frontends
3.apt install gcc-arm-none-eabi binutils-arm-none-eabi

C,編譯
cd nuttx
./tools/configure.sh -l stm32f4discovery:nsh
make menuconfig(需要自定義配置可使用)
make
make clean(要clean后重新編譯需要使用)
問題記錄:
make: “-C”選項需要非空字符串參數(shù)
make: *** [tools/Makefile.unix:326:dirlinks] 錯誤 2
網(wǎng)上搜索到CONFIG_APPS_DIR在預設的 .config 文件中定義,如果沒有定義,默認為 ../apps。目標 menuconfig 調用命令 kconfig-mconf 進行配置。所以我漏下載了app文件夾。我理解只要下載nuttx文件夾即可。原來2個都要下載的。

D,連接stlink調試
apt install openocd
openocd -f interface/st-link-v2.cfg -f target/stm32f1x.cfg -c 'init' -c 'program nuttx/nuttx.bin verify reset' -c 'shutdown'
結果沒有用,原來是路徑無法識別,把路徑補全了。我是stm32F407芯片不是f1,所以修改了cfg名字如下。
openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f target/stm32f4x.cfg
能正常連接咯~

三,ubuntu下基于codeblocks的交叉編譯stm32調試環(huán)境搭建

雖然配合上jlink可以在ubuntu環(huán)境下使用ozone,但是我在網(wǎng)上視頻看了codeblocks來調試,另外help中也用了codeblocks sim進行nuttx調試,我以前只知道eclipse進行交叉編譯及調試,沒有想到codeblocks也可以,所以按網(wǎng)上的老外的視頻教程操作了下,一開始沒有成功,但是我沒有放棄,仔細對比了下,codeblocks創(chuàng)建工程的路徑需要在源碼nuttx路徑。而不能僅通過外部導入nuttx路徑的code,否則Makefile找不到路徑。具體方法我做了記錄。
先安裝codeblacks
sudo apt install codeblocks
安裝教程編譯的gdb
sudo apt-get install gdb-arm-none-eabi
然后在命令窗口,root權限登錄,然后輸入codeblocks,就是按root權限打開codeblocks,否則編譯過程會提示沒有權限。

  1. Settings->Debugger


    image.png
  2. 點擊Create Config創(chuàng)建OpenOCD


    image.png
  3. 修改gdb文件路徑后點擊ok關閉窗口


    image.png
  4. 修改Compiler


    image.png

    image.png

    點擊右邊三角,選擇編譯工具頁進行修改,最后set as default。


    image.png
  5. 創(chuàng)建空白工程


    image.png

    點擊next,然后清空輸出物,僅設置Debug為all。來支持make all命令。然后點擊finish。


    image.png
  6. 修改屬性,This is customer Makefile打鉤。


    image.png

    轉入最后的debug頁修改。


    image.png
    再添加gdb命令,可以按需要自定義。
    monitor reset init和load nuttx和b nx_start
    image.png
  7. 導入code,然后選擇select all進行全部文件的導入,點擊ok


    image.png
  8. 進行編譯
    在用codeblocks的build前,其實已經按照nuttx官網(wǎng)的help用make命令編譯成功過,并且修改過配置項。用codeblocks的build主要是用來驗證codeblocks環(huán)境的。


    image.png

    編譯成功截圖


    image.png
  9. 插入Stlink,通過openOCD連接上
    openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f target/stm32f4x.cfg
  10. 在codeblocks中使用調試
    Debug->start就會停止在nx_start


    image.png

四,nuttx 10.0.1框架分析

  1. 文件夾目錄,按document中的help已經了解了。
  2. 然后我去看代碼,找第一句入口函數(shù)。
    boards\arm\stm32\stm32f4discovery\scripts\ld.script中ENTRY(_stext)說明入口是_stext,但是它是一個參數(shù)。而這個參數(shù)是在arch\arm\src\Makefile文件的$(Q) $(LD) --entry=__start $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS)中可以看出,傳入了--entry為__start,所以__start就是第一句入口函數(shù)。
    找到入口函數(shù)后,看code的框架就比較簡單了。先初始化board相關,然后初始化os相關,最后啟動os。每一段都有注釋,而且有showprogress的log,容易看的code都是設計的好的code。
  stm32_clockconfig();
  stm32_fpuconfig();
  stm32_lowsetup();
  stm32_gpioinit();
  showprogress('A');

nx_start()就是初始化os,然后調用nx_bringup()->nx_create_initthread->nx_start_application->nxtask_create創(chuàng)建第一個task并啟動。這個task函數(shù)為CONFIG_USER_ENTRYPOINT配置的值為nsh_main,這個具體在app文件夾中。等于進入APP code。APP code中若要創(chuàng)建task,依然可以調用nxtask_create。

五,小結

RTOS方面我最感興趣的就是調度機制,其它關于虛擬文件系統(tǒng),網(wǎng)絡模塊等只是大概了解下框架和主要的數(shù)據(jù)流?,F(xiàn)在編譯調試環(huán)境搭建完成了,之后可以進行源碼的深入理解階段了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容