pixhawk自学笔记之px4程序启动顺序
現在我們來看一下32是如何啟動的:
代碼位置:Firmware/build_px4fmu-v2_default/px4fmu-v2/Nuttx/nuttx/arch/arm/src/stm32/stm32_start.c
__start-- ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? #處理器執(zhí)行的第一條指令(px4使用的是stm32,入口在stm32_start.c中)
? ? ? ? |
? ? ? ? v
? ?stm32_clockconfig()------ ? ? ? ? ?? ?#初始化時鐘
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ? ?rcc_reset()? ? ? ? ? ? ?? ?????? ?? ???#復位rcc
? ? ? ? ? ? ? ? ?stm32_stdclockconfig()??? ? ?#初始化標準時鐘
? ? ? ? ? ? ? ??rcc_enableperipherals() ?? ? ?#使能外設時鐘
------------------------------------------------------------------
?
? ?stm32_fpuconfig() ? ? ? ? ? ?? ? ? ??? ???#配置fpu
? ?? ??? ?????? ??? ??? ? ? ? |
? ? ?? ??? ?????? ??? ??? ?? ?v
? ??? ??? ?????stm32_lowsetup() ? ? ? ? ? ? ?? ? ? #基本初始化串口,之后可以使用up_lowputc()
? ??? ??? ?????stm32_gpioinit() ? ? ? ? ? ? ?? ? ? ? #初始化gpio,只是調用stm32_gpioremap()設置重映射
? ?? ??? ??? ??up_earlyserialinit() ? ? ? ? ? ? ?? ? ?#初始化串口,之后可以使用up_putc()
? ?? ??? ??????stm32_boardinitialize()-- ? ? ? ? ?#板級初始化
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ??stm32_spiinitialize() ? ?? ??#初始化spi,只是調用stm32_configgpio()設置gpio
? ? ? ? ? ? ? ??stm32_usbinitialize() ??? ???#初始化usb,只是調用stm32_configgpio()設置gpio
? ? ? ? ? ? ? ? ??up_ledinit();???? ??? ??? ? ? ?#初始化led,只是調用stm32_configgpio()設置gpio
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ?----------------------------------------------------------------------------------------------
? ?在stm32_start.c文件中我們會看到這么一句話:
?
? ?os_start()--------------- ? ? ? ? ???? ??? ??? ???#初始化操作系統
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ? ?dq_init()? ? ? ? ? ? ? ????? ?? ??? ?????#初始化各種狀態(tài)的任務列表(置為null)
? ? ? ? ? ? ? ??g_pidhash[i]= ? ? ? ? ?????? ?? ???? #初始化唯一可以確定的元素--進程ID
? ? ? ? ? ? ? ??g_pidhash[PIDHASH(0)]= ? ? ?#分配空閑任務的進程ID為0
? ? ? ? ? ? ? ? ?g_idletcb=? ? ? ? ? ? ? ? ? ? ?? ? ? ?#初始化空閑任務的任務控制塊
? ? ? ? ? ? ? ??sem_initialize()-- ? ? ? ? ? ? ?? ? ?#初始化信號量
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? v
? ? ? ? ? ? ? ? ? ?? ?dq_init() ? ? ? ? ? ? ? ?? ? ? ? ? ?#將信號量隊列置為null
? ? ? ? ? ? ? ? ? ?? ?sem_initholders() ? ? ? ? ? ? #初始化持有者結構以支持優(yōu)先級繼承
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ?--------
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ??up_allocate_heap() ? ? ? ? #分配用戶模式的堆(設置堆的起點和大小)
? ? ? ? ? ? ? ??kumm_initialize() ? ? ? ? ? ?#初始化用戶模式的堆
? ? ? ? ? ? ? ??up_allocate_kheap() ? ? ? ?#分配內核模式的堆
? ? ? ? ? ? ? ??kmm_initialize() ? ? ? ? ? ? ? #初始化內核模式的堆
? ? ? ? ? ? ? ??task_initialize() ? ? ? ? ? ? ? ?#初始化任務數據結構
? ? ? ? ? ? ? ??irq_initialize() ? ? ? ? ? ? ? ?? #將所有中斷向量都指向同一個異常中斷處理程序
? ? ? ? ? ? ? ??wd_initialize() ? ? ? ? ? ? ? ?? #初始化看門狗數據結構
? ? ? ? ? ? ? ??clock_initialize() ? ? ? ? ? ? ? #初始化rtc
? ? ? ? ? ? ? ??timer_initialize() ? ? ? ? ? ? ? #配置POSIX定時器
? ? ? ? ? ? ? ??sig_initialize() ? ? ? ? ? ? ? ?? #初始化信號
? ? ? ? ? ? ? ??mq_initialize() ? ? ? ? ? ? ? ?? #初始化命名消息隊列
? ? ? ? ? ? ? ??pthread_initialize() ? ? ? ? ? #初始化線程特定的數據,空函數
? ? ? ? ? ? ? ? ?fs_initialize()---? ? ? ? ? ? ? ? #初始化文件系統
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? v
? ? ? ? ? ? ? ? ? ?? ?sem_init() ? ? ? ? #初始化節(jié)點信號量為1
? ? ? ? ? ? ? ? ? ?? ?files_initialize() #初始化文件數組,空函數
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ?--------
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ??net_initialize()-- ? ? ? #初始化網絡
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? v
? ? ? ? ? ? ? ? ? ?? ?uip_initialize() ??? ??#初始化uIP層
? ? ? ? ? ? ? ? ? ?? ?net_initroute() ??? ???#初始化路由表
? ? ? ? ? ? ? ? ? ?? ?netdev_seminit() ? #初始化網絡設備信號量
? ? ? ? ? ? ? ? ? ?? ?arptimer_init() ? ?? ??#初始化ARP定時器
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ?--------
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ??up_initialize()--- ? ? ? #處理器特定的初始化
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? v
? ? ? ? ? ? ? ? ? ?? ?up_calibratedelay()? ??? ?????#校準定時器
? ? ? ? ? ? ? ? ? ?? ?up_addregion() ??? ?????? ? ?? #增加額外的內存段
? ? ? ? ? ? ? ? ? ?? ?up_irqinitialize()?? ?????? ??? ??#設置中斷優(yōu)先級,關聯硬件異常處理函數
? ? ? ? ? ? ? ? ? ?? ?up_pminitialize() ?? ?????? ????#初始化電源管理
? ? ? ? ? ? ? ? ? ?? ?up_dmainitialize()?? ?????? ????#初始化DMA
? ? ? ? ? ? ? ? ? ?? ?up_timerinit() ? ??? ?????? ??? ???#初始化定時器中斷
? ? ? ? ? ? ? ? ? ?? ?devnull_register()?? ?????? ??? ?#注冊/dev/null
? ? ? ? ? ? ? ? ? ?? ?devzero_register()?? ?????? ????#注冊/dev/zero
? ? ? ? ? ? ? ? ? ?? ?up_serialinit() ? ?? ?????? ??? ??? ?#注冊串口控制臺/dev/console和串口/dev/ttyS0
? ? ? ? ? ? ? ? ? ?? ?up_rnginitialize()?? ?????? ??? ??#初始化并注冊隨機數生成器
? ? ? ? ? ? ? ? ? ?? ?up_netinitialize()?? ?????? ??? ???#初始化網絡,是arch/arm/src/chip/stm32_eth.c中的
? ? ? ? ? ? ? ? ? ?? ?up_usbinitialize()?? ?????? ??? ???#初始化usb驅動
? ? ? ? ? ? ? ? ? ?? ?board_led_on() ? ??? ?????? ??? ???#打開中斷使能led,但很快會被其它地方的led操作改變狀態(tài)
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ?--------
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ??lib_initialize() ? ? ? ?????? ??? ? ?#初始化c庫,空函數
? ? ? ? ? ? ? ??group_allocate() ? ? ? ?????? ??#分配空閑組
? ? ? ? ? ? ? ??group_setupidlefiles() ? ? ? ?#在空閑任務上創(chuàng)建stdout、stderr、stdin
? ? ? ? ? ? ? ??group_initialize() ? ? ? ? ? ? ??#完全初始化空閑組
? ? ? ? ? ? ? ??os_bringup()------ ? ? ? ? ? ? ?#創(chuàng)建初始任務
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? v
? ? ? ? ? ? ? ? ? ?? ?KEKERNEL_THREAD() ? ?#啟動內核工作者線程
? ? ? ? ? ? ? ? ? ?? ?board_initialize() ? ? ? ? ? #最后一刻的板級初始化
? ? ? ? ? ? ? ? ? ?? ?TASK_CREATE() ? ? ? ? ? ? #啟動默認應用程序
? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ?? ? ? ?--------
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? ? ? ? ? ? ?? ? ? ?v
? ? ? ? ? ? ? ? ?forup_idle() ? ? ? ? ? ? ? ? ? ?? ? ?#空閑任務循環(huán)
? ? ? ? ? ? ? ? ? ?? ? ? ?|
? ? ? ? --------------------
? ? ? ? |
? ? ? ? v
? ?for(;;) ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?#不應該到達這里
?
?
?
我們看到這里初始化了各種資源,最后進入一個空閑任務,而在空閑任務的前面我們看到對其他任務也進行了初始化。這是在os_bringup.c文件中。
這里是啟動默認的應用程序,入口點由CONFIG_USER_ENTRYPOINT給出。
這里就相當于Linux中啟動了shell,然后去執(zhí)行初始化腳本。
進入控制臺程序,也就是nsh_consolemain()函數。在這里實際上nsh_initscript和nsh_session都會去執(zhí)行命令,但是前者是執(zhí)行啟動腳本也就是rcS,后者是執(zhí)行用戶程序。
到了這里我就發(fā)現px4飛控主線程都是在腳本中以命令的方式啟動的,拋開腳本,單純看源碼是看不出px4飛控主線程是如何啟動的。
總結
以上是生活随笔為你收集整理的pixhawk自学笔记之px4程序启动顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows / Ubuntu操作系统
- 下一篇: pixhawk原生固件笔记