一,前言
最近看技術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,否則編譯過程會提示沒有權限。
-
Settings->Debugger
image.png -
點擊Create Config創(chuàng)建OpenOCD
image.png -
修改gdb文件路徑后點擊ok關閉窗口
image.png -
修改Compiler
image.png
image.png
點擊右邊三角,選擇編譯工具頁進行修改,最后set as default。
image.png -
創(chuàng)建空白工程
image.png
點擊next,然后清空輸出物,僅設置Debug為all。來支持make all命令。然后點擊finish。
image.png -
修改屬性,This is customer Makefile打鉤。
image.png
轉入最后的debug頁修改。
再添加gdb命令,可以按需要自定義。image.png
monitor reset init和load nuttx和b nx_start
image.png -
導入code,然后選擇select all進行全部文件的導入,點擊ok
image.png -
進行編譯
在用codeblocks的build前,其實已經按照nuttx官網(wǎng)的help用make命令編譯成功過,并且修改過配置項。用codeblocks的build主要是用來驗證codeblocks環(huán)境的。
image.png
編譯成功截圖
image.png - 插入Stlink,通過openOCD連接上
openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f target/stm32f4x.cfg -
在codeblocks中使用調試
Debug->start就會停止在nx_start
image.png
四,nuttx 10.0.1框架分析
- 文件夾目錄,按document中的help已經了解了。
- 然后我去看代碼,找第一句入口函數(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)境搭建完成了,之后可以進行源碼的深入理解階段了。














