Pixhawk_nuttx启动过程和启动文件

2023-05-16

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Pixhawk_nuttx启动过程</span>

所有内容均来自网络,结合自己查看代码加上的注释,不对之处请指出;

QQ:4862879


通过系统在编译生成的 elf 文件 我们可以查看到nuttx 的文件头中可以找到这个程序入口点的地址0x80003d1;

根据 cortex-m3 的定义,系统从 flash 启动时,0x08000004中的值就是 PC(程序计数器)的初始值,这才是真正起作用的,它决定了处理器执行的第一条指令。

nuttx.S文件中关于启动地址的说明:
8000004:    080003d1     .word    0x080003d1       <---PC 初始值  
080003d0 <__start>:  
80003d0:    b510          push    {r4, lr}         <---处理器执行的第一条指令


启动代码文件:PX4NuttX/nuttx/arch/arm/src/stm32/stm32_start.c

1.	__start--      #处理器执行的第一条指令 (px4使用的是stm32,入口在stm32_start.c中) 
2.	        |  
3.	        v  
4.	   stm32_clockconfig()------              #初始化时钟 80003d2:    f000 f827     bl    8000424 
5.	                           |  
6.	                           v  
7.	                 rcc_reset()              #复位rcc  
8.	                 stm32_stdclockconfig()   #初始化标准时钟  
9.	                 rcc_enableperipherals()  #使能外设时钟  
10.	                           |  
11.	        --------------------  
12.	        |  
13.	        v  
14.	   stm32_fpuconfig()                      #配置fpu,  
15.	   stm32_lowsetup()                       #基本初始化串口,之后可以使用up_lowputc()  
16.	   stm32_gpioinit()                       #初始化gpio,只是调用stm32_gpioremap()设置重映射  
17.	   up_earlyserialinit()                   #初始化串口,之后可以使用up_putc()  
18.	   stm32_boardinitialize()--              #板级初始化  
19.	                           |  
20.	                           v  
21.	                 stm32_spiinitialize()    #初始化spi,只是调用stm32_configgpio()设置gpio  
22.	                 stm32_usbinitialize()    #初始化usb,只是调用stm32_configgpio()设置gpio  
23.	                 board_led_initialize()   #初始化led,只是调用stm32_configgpio()设置gpio  
24.	                           |  
25.	        --------------------  
26.	        |  
27.	        v  
28.	   os_start()-------------#初始化操作系统  ardupilot\modules\PX4NuttX\nuttx\sched\os_start.c
29.	                           |  
30.	                           v  
31.	                 dq_init()                #初始化各种状态的任务列表(置为null)  
32.	                 g_pidhash[i]=            #初始化唯一可以确定的元素--进程ID  
33.	                 g_pidhash[PIDHASH(0)]=   #分配空闲任务的进程ID为0  
34.	                 g_idletcb=               #初始化空闲任务的任务控制块  
35.	                 sem_initialize()--       #初始化信号量  
36.	                                  |  
37.	                                  v  
38.	                       dq_init()          #将信号量队列置为null  
39.	                       sem_initholders()  #初始化持有者结构以支持优先级继承, 
40.	                                  |  
41.	                           --------  
42.	                           |  
43.	                           v  
44.	                 up_allocate_heap()       #分配用户模式的堆(设置堆的起点和大小)  
45.	                 kumm_initialize()        #初始化用户模式的堆  
46.	                 up_allocate_kheap()      #分配内核模式的堆, 
47.	                 kmm_initialize()         #初始化内核模式的堆, 
48.	                 task_initialize()        #初始化任务数据结构, 
49.	                 irq_initialize()         #将所有中断向量都指向同一个异常中断处理程序  
50.	                 wd_initialize()          #初始化看门狗数据结构  
51.	                 clock_initialize()       #初始化rtc  
52.	                 timer_initialize()       #配置POSIX定时器  
53.	                 sig_initialize()         #初始化信号  
54.	                 mq_initialize()          #初始化命名消息队列  
55.	                 pthread_initialize()     #初始化线程特定的数据,空函数  
56.	                 fs_initialize()---       #初始化文件系统  
57.	                                  |  
58.	                                  v  
59.	                       sem_init()         #初始化节点信号量为1  
60.	                       files_initialize() #初始化文件数组,空函数  
61.	                                  |  
62.	                           --------  
63.	                           |  
64.	                           v  
65.	                 net_initialize()--       #初始化网络  
66.	                                  |  
67.	                                  v  
68.	                       uip_initialize()   #初始化uIP层  
69.	                       net_initroute()    #初始化路由表,  
70.	                       netdev_seminit()   #初始化网络设备信号量  
71.	                       arptimer_init()    #初始化ARP定时器  
72.	                                  |  
73.	                           --------  
74.	                           |  
75.	                           v  
76.	                 up_initialize()---       #处理器特定的初始化  
77.	                                  |  
78.	                                  v  
79.	                       up_calibratedelay()#校准定时器  
80.	                       up_addregion()     #增加额外的内存段  
81.	                       up_irqinitialize() #设置中断优先级,关联硬件异常处理函数  
82.	                       up_pminitialize()  #初始化电源管理, 
83.	                       up_dmainitialize() #初始化DMA,  
84.	                       up_timerinit()     #初始化定时器中断  
85.	                       devnull_register() #注册/dev/null  
86.	                       devzero_register() #注册/dev/zero,  
87.	                       up_serialinit()    #注册串口控制台/dev/console和串口/dev/ttyS0  
88.	                       up_rnginitialize() #初始化并注册随机数生成器  
89.	                       up_netinitialize() #初始化网络,是arch/arm/src/chip/stm32_eth.c中的  
90.	                       up_usbinitialize() #初始化usb驱动, 
91.	                       board_led_on()   #打开中断使能led,
92.	                                  |  
93.	                           --------  
94.	                           |  
95.	                           v  
96.	                 lib_initialize()         #初始化c库,空函数  
97.	                 group_allocate()         #分配空闲组  
98.	                 group_setupidlefiles()   #在空闲任务上创建stdout、stderr、stdin  
99.	                 group_initialize()       #完全初始化空闲组  
100.	                 os_bringup()------       #创建初始任务  os_bringup.c
101.	                                  |  
102.	                                  v  
103.	                       KEKERNEL_THREAD()  #启动内核工作者线程  
104.	                       board_initialize() #最后一刻的板级初始化,nsh未调用  
105.	                       TASK_CREATE()      #启动默认应用程序  os_bringup.c
106.	                                  |  
107.	                           --------  
108.	                           |  
109.	                           v  
110.	                 for up_idle()            #空闲任务循环  
111.	                           |  
112.	        --------------------  
113.	        |  
114.	        v  
115.	   for(;;)                                 



TASK_CREATE()这里是启动默认的应用程序,入口点由CONFIG_USER_ENTRYPOINT给出

TASK_CREATE()启动Nsh终端程序, nsh_script.c文件中的 nsh_initscript
NSH.h中NSH_INITPATH文件为RCS文件路径, 开始执行rcS脚本文件.
进入控制台程序,也就是nsh_consolemain()函数。在这里实际上nsh_initscript和nsh_session都会去执行命令,但是前者是执行启动脚本也就是rcS,后者是执行用户程序。

当系统启动NSH之后,系统就算是正常启动起来了,之后NSH通过脚本启动PX4代码或Ardupilot代码;
Ardupilot的启动脚本:
rcS: Nuttx系统默认的启动脚本,

        Ardupilot代码中用来加载LED灯,SD卡,USB连接,最后加载Ardupilot的启动文件rc.APM;
rc.APM:

        创建SD卡中的APM目录,

       加载binfs,

       检测硬件版本V1,V2,V4,

       启动Uorb,

       检测PX4IO板,并BIN的更新,

       加载各种传感器,hmc5883,mpu6000,空速,声纳,光流,PWM输入,指示灯,smbus电池检测,IR;


       最后启用Ardupilot启动飞控代码, Ardupilot内嵌程序,Builtin_Commandes.c中有定义.

echo Starting ArduPilot $deviceA $deviceC $deviceD
if ArduPilot -d $deviceA -d2 $deviceC -d3 $deviceD start
then
    echo ArduPilot started OK;启动Ardupilot飞控代码,
else
    sh /etc/init.d/rc.error
fi

echo "rc.APM finished" 

APM启动成功






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pixhawk_nuttx启动过程和启动文件 的相关文章

  • 串口实用的循环缓冲区

    小记 项目临时需要单片机进行节点控制 xff0c 主要用来控制模块的开关 xff0c 以串口进行通讯 单片机几多久没玩了 xff0c 选用的是C8051F920 xff0c 传说中增强型51 xff0c 不过看了Datesheet 还是51
  • C++学习:编译

    编译 为了编译 C 43 43 程序 xff0c 我们使用 C 43 43 编译器 C 43 43 编译器按顺序遍历程序中的每个源代码 cpp 文件 它会检查您的代码以确保它遵循 C 43 43 语言的规则 如果没有 xff0c 编译器会给
  • 堆、栈、方法区存储的变量的类型

    1 堆 xff08 Heap xff09 xff0c 此内存区域的唯一目的就是存放对象实例 xff0c 几乎所有的对象实例都在这里分配内存 这一点在 Java 虚拟机规范中的描述是 xff1a 所有的对象实例以及数组都要在堆上分配 2 通常
  • stm32串口中断的接收

    利用串口使得led点亮 利用之前的串口函数加上NVIC的中断函数结构体 定义结构体 定义 配置抢占优先级的组别 配置NVIC串口中断的结构体 xff1a 中断的通道 xff0c 配置抢占优先级和子优先级 使能CMD 结构体初始化 还有需要配
  • 4.1.2.HTTP报文格式解析

    不同的请求方式 xff0c 他们的请求格式可能是不一样的 xff0c 请求格式就是我们所说的的报文格式 但是 xff0c 通常来说一个HTTP请求报文由请求行 xff08 request line xff09 请求头 xff08 heade
  • QSerialPort实现上位机和单片机串口通信模块

    一 背景知识 项目需要 xff0c 上位机控制单片机执行任务 xff0c 单片机会发送心跳包和任务指令到上位机 xff0c 因此采用全双工模式 xff0c 使用Qt自带QSerialPort实现 二 设计思路 模块需发送和接收数据 xff0
  • 加速度计,磁力计与姿态角的关系。(网上很多资料都是错的,请看我的!)

    请读者自行把公式 xff08 3 1 xff09 计算出来 xff0c 然后得到两个列向量 xff0c 如下图 xff1a 注意 xff0c 网上关于俯仰角给出了不少公式 xff0c 但是都是来自这两个向量的对应关系 我写出的应该是最简形式
  • 传输层协议 ——— UDP协议

    文章目录 传输层再谈端口号端口号范围划分认识知名端口号两个问题netstat与iostatpidof UDP协议UDP协议格式UDP协议的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议 传输层 在学习HTTP等应用层协
  • Authentication 和 Authorization 的区别

    Authentication 和 Authorization 的区别 背景 我们经常会遇到这两个单词 xff0c 有些人会有疑惑 xff0c 但其实他们区分还是比较清晰的 本人用大白话 xff0c 用我自己的理解写出 区别 authenti
  • c语言中<algorithm>头文件因使用STL在部分oj系统中编译错误的猜测与解决方案。

    最近在使用北邮oj系统时 xff0c 代码编译总无法通过 xff0c 在网络查找答案后 xff0c 有了一些初步的想法 具体原因猜测是因为 lt algorithm gt 头文件包含了STL标准模板库 xff0c 而oj系统可能采用的VC6
  • 一种嵌入式设备串口加密协议

    嵌入式设备串口通讯一般都会明文通讯 但在某些应用场合我们也有加密需求 以下为一种加密方式的建议 上位机 主机 定义为Master 下位机 从机 定义为Slaver 通讯协议建议 完整数据格式 帧头Header 43 数据长度Length 4
  • ubuntu 修改socket最大连接数

    在Linux系统上 xff0c 无论编写应用程序还是测试 xff0c 在进行高并发TCP连接处理时 xff0c 最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制 这是因为系统为每个TCP连接都要创建一个socket句柄 xf
  • [C++11]std::atomic、boost::atomic、Interlocked三者的性能比较(benchmark)

    原文作者 xff1a 64 玄冬Wong 好久没做过benchmark了 xff0c 这次之所以想测试下 xff0c 是怕std atomic的效率没有windows的Interlocked性能好 xff0c 测一下发现 xff0c 性能差
  • Nvidia Xavier NX安装并测试Cartographer

    这里写自定义目录标题 前言安装过程软件包 前言 最近成功在Nvidia Xavier NX和Nvidia Xavier AGX安装并测试了谷歌的开源激光slam算法Cartographer xff0c 在此记录下过程中的一些坑 安装过程 首
  • TTL/RS232/RS422/RS485串行通信接口区别与波形

    TTL RS232 RS422 RS485通信接口区别与波形 串行通信接口区别串口数据帧格式接线图波形图 串行通信接口区别 TTL RS232 RS422 RS485指的是电平接口标准 xff0c 都属于串行通信接口 xff0c 即串口 x
  • 什么是RT-Thread?

    一 RT Thread的定义 RT Thread xff0c 全称是 Real Time Thread xff0c 是一款主要由中国开源社区主导开发的开源实时操作系统 xff08 许可证GPLv2 xff09 xff0c 包含了实时 嵌入式
  • mbim ndis ecm ncm之我的理解

    这几个问题困扰了我很长时间 xff0c 经过我不懈的努力 加上 我的悟性 xff0c 我自认为 理解了那么一点 ndis xff08 Network Driver Interface Specification xff09 网络驱动接口规范
  • RTK基站坐标,标定

    差分基站的经纬度是人为设定的 xff0c 一般来说 xff0c RTK差分定位是测试的相对值 xff0c 但前提是要给基站设置一个相对精确的经纬度 xff0c 之前没有意识到重要性 xff0c 这次出现的问题 xff0c 确认了这一点 公司
  • Codeblocks+vscode

    由于新买了电脑 xff0c 要重装好多东西 xff0c 简单记录一下 顺序 xff1a 先codeblocks xff0c 后vscode 第一步 xff1a Codeblocks安装 Binary releases Code Blocks
  • wifi 802.11 kvr 漫游

    802 11k 802 11k为无线局域网应该如何进行信道选择 漫游服务和传输功率控制提供了标准 他提供无线资源管理 xff0c 让频段 xff08 BAND xff09 通道 xff08 CHANNEL xff09 载波 xff08 CA

随机推荐

  • WIFI 常识

    DSSS Direct Sequence Spread Spectrum 直接序列扩频 FHSS xff0c 跳频技术 Frequency Hopping Spread Spectrum FHSS和DSSS比较 跳频扩频 xff08 FHS
  • vscode 增加includepath

    方法一 xff1a 按下ctrl 43 shift 43 p打开命令 xff0c 搜索下面关键字 c c 43 43 edit configration 修改下面includepath栏 xff0c 按上面的说明提示修改 34 config
  • STM32F437 CAN错误(一个不发送CAN数据的节点,是会影响CAN总线的)

    终于解决综合插件CAN导致 刷揭示错误的问题 xff0c 过程记录一下 xff0c 有的时候 xff0c 很多错误是可以避免的 xff0c 但是一旦出现 xff0c 解决 排查错误的过程会区级费很长时间 我们的产品有3 4个CAN节点 xf
  • stm32使用PWM播放音频

    我之前研究过STM32的DAC播放wav音频文件 xff0c 今天突然发现使用PWM也可以实现WAV文件的播放 xff0c 让在大开了眼界 xff0c 转载如下 xff1a stm32使用PWM播放音频 pwm stm32 dac pcm
  • uboot 增加硬件看门狗

    先说说uboot的编译过程 xff1a 1 make distclean 2 make defconfig 3 make 在执行上面之前 xff0c 还需要必要 的设置 xff0c 比如配置ARCH CROSS COMPILE 等等 xff
  • ALTRA FPGA程序移植到XILINX CPLD

    由于altra FPGA买不到了 xff0c 现在使用xilinx的CPLD 95144来替换 xff0c 本来想把之前的verilog工程直接重新在ISE上编译一下 xff0c 就可以了 xff0c 看来我是低估FPGA到CPLD的移植过
  • 图形化的调试工具 j-scope systemview

    2022 03 01 当调试传感器 AD值时 xff0c 特别想把转换值直观的展示出来 xff0c 就用到了下面几咱方法 通常的解决办法是用串口上位机 xff0c USB接口上位机或者MDK的逻辑分析仪功能 xff0c 使用这三种方式都比较
  • 移远ec20模式与切换

    移远EC20支持4种模式 0 rmnet模式 通过QMI工具发的QMI命令 xff0c 获取公网IP 这种模式可以配合usb ecm驱动或高通GobiNet驱动使用 1 ecm模式 通过标准的CDC ECM发起data call xff0c
  • STM32开发必备知识篇:串口DMA空闲中断

    随着撰写博客的深入 xff0c 笔者先初步打算把博客细分为四大板块 xff1a 1 FPGA基础知识篇 xff1b 2 FPGA 20个例程篇 xff1b 3 STM32开发必备知识篇 xff1b 4 STM32 10个项目篇 xff0c
  • 大端小端(Big- Endian和Little-Endian)

    字节序 xff08 Endian xff09 xff0c 大端 xff08 Big Endian xff09 xff0c 小端 xff08 Little Endian xff09 图文并茂 http www cppblog com tx7d
  • STM32程序设计规范浅析

    这篇博客写到 STM32基础知识篇 里 xff0c 一方面是一个很好地对过往工作的总结 xff0c 另一方面也是整个专栏撰写计划的开端 xff0c 古人云 xff1a 良好的开端是成功的一半 xff0c 在文章的最后详细地规划了整个专栏后期
  • C语言编程规范(头文件规范)

    C语言的规范使用 xff0c 有利于提高代码的清晰 简洁 可测试 安全 效率 可移植 xff0c 因此必须规范使用C语言编程 代 码 总 体 原
  • C语言变量和常量命名规则

    变量命名规则 原则 1 一个变量只有一 个功能 xff0c 不能把一个变量用作多个用途 2 结构单一 xff0c 不能设计面面俱到的数据结构 xff1b 结构的定义应该明确的描述一个对象 xff0c 去掉相关相不强的数据 xff1b 3 不
  • ROS+Gazebo----Unable to find uri[model:// ]

    基于ROS 43 Gazebo环境 xff0c 用roslaunch把sdf模型加载到gazebo仿真世界 目录结构如下 输入命令roslaunch my simulation my world launch 报错 xff1a 1 不接入网
  • 最完整介绍Visual C++ 6.0和Visual Studio 2022中的编译、生成和运行(CTRL+F7、F7、CTRL+F5)

    我是荔园微风 xff0c 作为一名在IT界整整25年的老兵 xff0c 经常被Visual C 43 43 6 0和Visual Studio 2022初学者问到程序写好后怎么使用编译调试菜单以及怎么使用CTRL 43 F7 F7 CTRL
  • 判断大小端的方法(java和c++)

    首先我们给出大小端的定义 小端 xff1a 较高的有效字节存放在较高的的存储器地址 xff0c 较低的有效字节存放在较低的存储器地址 大端 xff1a 较高的有效字节存放在较低的存储器地址 xff0c 较低的有效字节存放在较高的存储器地址
  • vscode配置c++代码提示补全

    vscode配置c 43 43 代码提示补全 在网上找了大半天 xff0c 说的方式都试过了 xff0c 都没有适合我的 xff0c 还是自己找stackoverflow靠谱点 34 editor rulers 34 80 一行限制80字符
  • 解决头文件相互包含问题的方法

    解决头文件相互包含问题的方法 所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数 一般情况下 xff0c C C 43 43 要求所有的类型必须在使用前被定义 xff0c 但是在一些特殊情况下 xff0c 这种要求无法满足 xff
  • C++ 中头文件相互包含问题的解决办法

    我们在写C 43 43 程序的时候 xff0c 常常要把不同的类的声明放置与不同的头文件中 xff0c 以提高代码的整洁性 xff0c 如此一来 xff0c 就难免会遇到头文件相互包含的问题 xff0c 也就是说 xff0c 假设我们有两个
  • Pixhawk_nuttx启动过程和启动文件

    lt span style 61 34 font family Arial Helvetica sans serif background color rgb 255 255 255 34 gt Pixhawk nuttx启动过程 lt s