pixhawk自学笔记之px4程序启动顺序

2023-05-16


在了解px4启动之前我们需要了解一下bootloader。Bootloader是在操作系统内核运行之前运行,可以初始化硬件设备,建立内存空间映射图等,整个系统的加载启动任务就是完全由Bootloader来完成的。它还是嵌入式系统在加电后执行的第一段代码,在它完成cpu和相关硬件的初始化后,再将操作系统映像或固化的嵌入式应用程序装在内存中然后跳转到操作系统所在的空间,启动操作系统运行(后面会有一篇专门学习px4的Bootloader)


现在我们来看一下32是如何启动的:

代码位置:Firmware/build_px4fmu-v2_default/px4fmu-v2/Nuttx/nuttx/arch/arm/src/stm32/stm32_start.c

__start--                                #处理器执行的第一条指令(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()                                #初始化各种状态的任务列表(置为null)

                g_pidhash[i]=                        #初始化唯一可以确定的元素--进程ID

                g_pidhash[PIDHASH(0)]=      #分配空闲任务的进程ID为0

                 g_idletcb=                            #初始化空闲任务的任务控制块

                sem_initialize()--                   #初始化信号量

                                 |

                                 v

                      dq_init()                           #将信号量队列置为null

                      sem_initholders()             #初始化持有者结构以支持优先级继承

                                 |

                          --------

                          |

                          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()         #初始化节点信号量为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()                #设置中断优先级,关联硬件异常处理函数

                      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操作改变状态

                                 |

                          --------

                          |

                          v

                lib_initialize()                     #初始化c库,空函数

                group_allocate()                #分配空闲组

                group_setupidlefiles()        #在空闲任务上创建stdout、stderr、stdin

                group_initialize()               #完全初始化空闲组

                os_bringup()------              #创建初始任务

                                 |

                                 v

                      KEKERNEL_THREAD()    #启动内核工作者线程

                      board_initialize()           #最后一刻的板级初始化

                      TASK_CREATE()             #启动默认应用程序

                                 |

                          --------

                          |

                          v

                 forup_idle()                         #空闲任务循环

                          |

        --------------------

        |

        v

   for(;;)                               #不应该到达这里

 

 

 

我们看到这里初始化了各种资源,最后进入一个空闲任务,而在空闲任务的前面我们看到对其他任务也进行了初始化。这是在os_bringup.c文件中。


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

这里就相当于Linux中启动了shell,然后去执行初始化脚本。



进入控制台程序,也就是nsh_consolemain()函数。在这里实际上nsh_initscript和nsh_session都会去执行命令,但是前者是执行启动脚本也就是rcS,后者是执行用户程序。

到了这里我就发现px4飞控主线程都是在脚本中以命令的方式启动的,抛开脚本,单纯看源码是看不出px4飞控主线程是如何启动的。



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

pixhawk自学笔记之px4程序启动顺序 的相关文章

  • 数据清洗的一些梳理

    xff08 欢迎转载到个人朋友圈 xff0c 转载时请带原文链接 xff0c 公众号和其他媒体转载前请私信联系本人获取授权 xff09 首先对 64 MayaG表示感谢 xff0c 这篇文章是被你提的问题激发出的灵感 xff0c 非常感谢
  • Conda install package遇到CondaHTTPError: HTTP 000 Connection Failed问题

    新安装的anaconda xff0c 在使用conda install时候会遇到错误信息 xff1a SSLError MaxRetryError 39 HTTPSConnectionPool host 61 39 repo anacond
  • 通过Node-Red将西门子PLC数据上传至阿里云物联网平台并进行可视化显示

    本篇基于我之前的文章 利用Node Red读写西门子PLC并将数据上传至云服务器 xff0c Node Red搭建及读写PLC部分请参考该文章 首先在阿里云物联网平台开通公共实例 xff0c 开通成功后在公共实例的设备管理 产品处点击创建产
  • C++笔记--关于string, char*, char[]中的‘\0’问题(2-3)

    0 问题 const char 字符串 以 0 结尾char 字符串 以 0 结尾string 字符串 不以 0 结尾char n 61 34 string 34 当string 长度 43 0 gt n时 xff0c 会因空间不足出错st
  • 经典C++笔试题目--100(C++面向对象的特性(38-61))

    C 43 43 面向对象的特性 38 61 38 是不是一个父类写了一个virtual 函数 xff0c 如果子类覆盖它的函数不加virtual 也能实现多态 参考答案 virtual修饰符会被隐形继承的 virtual可加可不加 子类的空
  • 经典C++笔试题目--100(编程练习(比C要难)(91-100))

    编程练习 比C要难 91 100 91 请编写一个 C 函数 xff0c 该函数给出一个字节中被置 1 的位的个数 参考答案 unsigned int TestAsOne0 char log int i unsigned int num 6
  • 小四轴调试笔记

    9 22 使用dmp进行姿态解算时 由于小四轴尺寸很小 电机和6050的距离略近 电机对MPU6050的影响就会很大当然 这种情况仅发生在尺寸很小的小四轴并且使用DMP时 图为电机转速增到最大时6050的值 可见加速度和角速度都发生了剧烈变
  • [STM32]开源光流定点 四轴 PIX

    废话不多说先上图 xff1a 硬件配置 xff1a STM32F407VET6 MPU6050 VL53L0X 光流的概念是Gibson在1950年首先提出来的 它是空间运动物体在观察成像平面上的像素运动的瞬时速度 xff0c 是利用图像序
  • svn status详解

    svn 是在提交前查看本地文本和版本库里面的文件的区别 返回值有许多种具体含义如下 xff1a url 61 L abc c svn已经在 svn目录锁定了abc c M bar c bar c的内容已经在本地修改过了 M baz c ba
  • 如何应对软件需求不明确、需求频繁更改和需求的无底洞

    入职以来一直会遇到这种问题 xff0c 也许是软件行业的死穴 xff0c 任何项目如果处理不好解决不了这些问题 xff0c 就相当于得了慢性绝症 xff0c 不但项目的结局是死路 xff0c 经手项目的每 个开发人员到管理者都在经受挑战人体
  • Ubuntu 20.04换国内源 清华源 阿里源 中科大源 163源

    Ubuntu 20 04 是 Ubuntu 的第 8 个 LTS 版本 xff0c 其重大更新和改进将在 2030 年前终止 xff0c 计划于2020年 4 月 23 日发布 国内有很多Ubuntu的镜像源 xff0c 包括阿里的 网易的
  • 详解100行c11线程池 ThreadPool.h

    介绍 这个大神的100行实现c11线程池 xff0c 真的是相当简洁给力 xff0c 偶尔会在项目里面使用 xff0c 但是老实说一直是迷迷糊糊 xff0c 并不清楚具体实现细节 xff0c 现在有空学习了一波 xff0c 记录一下 xff
  • ORB特征提取匹配opencv3代码实现

    span class hljs preprocessor include lt iostream gt span span class hljs preprocessor include lt opencv2 core core hpp g
  • 利用ZeroMQ传输图片

    待传输的数据 cv Mat mat 订阅端 xff08 sub xff09 import cv2 import zmq sub port 61 span class hljs number 6666 span context 61 zmq
  • OpenStack部署工具总结

    目前感觉比较简单直观的部署工具有RDO devstack Fuel等 xff1a 1 RDO https OpenStack redhat com Quickstart REDHAT出品 xff0c 支持Redhat CentOS等系统 R
  • Python中的函数与变量讲解

    不知道大家在学习Python的时候 xff0c 有没有发现一个问题 xff0c 函数里边的变量和脚本里边的变量好像是无关的 本文今天要讲的就是Python中的函数与变量 xff0c 如果大家对于这个方面的内容有困惑 xff0c 不妨来一起学
  • Python+OpenCV静态图像读取与显示_Haar模型实现简单的人脸识别

    目的 xff1a 1 主要是熟悉一下静态图像的读取与显示 xff1b 2 然后了解下基于OpenCV安装目录下haar特征识别人脸区域 人脸特征数据 基于 tengxing007 的博客 xff1a Python 43 OpenCV 实现简
  • 富斯FS-T6 APM飞控四种飞行模式设置方法_MIX混控设置

    来源于5iMX论坛的这篇帖子 富斯FS T6 APM飞控两种飞行模式设置方法点击打开链接 但是我按照作者的设置MIX的方法 xff0c 怎么都只有三种通道 先上图吧 xff1a 1 我的混控设置 xff1a OFFSET是偏移量 xff0c
  • Netfilter笔记-02

    Netfilter说白了就是针对不同的协议 xff08 协议类型和hook节点我们上一章已经讲过 xff09 在kernel中放置了不同的hook节点 xff0c 等数据包sk buff xff0c 到来的时候 xff0c 要给hook节点
  • 如何做在短时间内搞定VR交互的核心技能?

    转 http 36kr com p 5056703 html ktm source 61 feed amp from 61 timeline 从平面到空间 xff0c 虚拟现实正在开启一场全新的交互方式的变迁 xff0c 更或者 xff0c

随机推荐

  • 单目视觉的运动目标跟踪定位

    转 http www leiphone com news 201704 z87wjT8j9s94tMnG html 市场上空间定位的技术方案分为单目 双目以及激光雷达三大阵营 xff0c 其中激光雷达由于成本高昂市场接受度较低 xff0c
  • 关于IP地址、网络号、主机号、子网掩码之间的关系

    IP地址类似于我们的身份证号码 国家为了唯一确定我们每个人的身份 xff0c 会为我们每个人分配一个唯一确定身份的号码 xff0c 同理 xff1a 为了确切地标识Internet xff08 互联网 xff09 中的每一台主机和路由器 x
  • Android原生编解码接口 MediaCodec 之——踩坑

    关键帧 MediaCodec 有两种方式触发输出关键帧 xff0c 一是由配置时设置的 KEY FRAME RATE 和KEY I FRAME INTERVAL参数自动触发 xff0c 二是运行过程中通过 setParameters 手动触
  • [xshell6过期解决方案]xshell6评估过期 如何继续使用(亲测有效) 100%成功

    过完年来上班第一天打开xshell提示评估过期了 很是尴尬 搞了老半天才弄好 下面来分享一下我的解决过程 大家严格按照下面的流程走就可以了 基本都可以成功 如果没成功 那一定是你的姿势不对 1 我之前下载的是evaluation版本 xff
  • # Ubuntu 配置自带vnc桌面共享

    Ubuntu 配置自带桌面共享 1 在setting gt gt shareing gt gt remote 选择on 如果用ubunutu直接远程连接的话已经可以了 xff0c 2 在ubuntu下使用系统自带的remmina连接 vnc
  • netconf学习-安装ncclient客户端提示'install_requires'错误

    环境说明 xff08 1 xff09 操作系统 xff1a centos7 7 xff08 2 xff09 python版本 xff1a 2 7 5 问题描述 在学习netconf的时候需要编写netconf自动化 xff0c 此时就需要用
  • Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C#)(Mono)

    Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式 xff08 C xff09 Baumer工业相机Baumer工业相机图像数据转为Bitmap的技术背景Baumer工业相机使用BGAPISDK将图
  • OpenStack版本

    OpenStack的每个主版本系列以字母表顺序 xff08 A Z xff09 命名 xff0c 以年份及当年内的排序做版本号 xff0c 从第一版的Austin xff08 2010 1 xff09 到目前最新的稳定版Liberty xf
  • PX4FLOW光流模块DIY(含部分代码讲解)

    暑假有时间整理一下以前做的东西 xff0c 发发博客 xff0c 既给网友们学习也方便自己交流 今天讲讲我两年前从github学习的PX4FLOW光流模块 光流是视觉导航的重要部分 在运动检测和许多slam技术都使用到了光流 xff0c 但
  • 一路(16)相随,一起(17)前行

    2016年对于楼主来说 xff0c 是艰难的一年 xff0c 也是幸运的一年 xff0c 我想把我的故事说给你听 xff01 迈入IT行业已经快一年了 xff0c 但是实际上真正练习的时间只有仅仅的四个多月 xff0c 之前的专业是电子方面
  • 英文突然间隔变大

    之前总是遇到一个尴尬的问题 xff0c 就是写文档的时候间距突然变大 xff0c 调整段落间距并未没有效果 xff0c 例如这种 xff1a 解决办法 xff1a Shift 43 空格
  • JAVA从入门到精通(2)

    一 Java中的关键字 1 关键字 xff1a 具有一些特殊用途的词 2 注 xff1a 在程序中应用关键词需要慎重 xff01 3 常用的关键词 xff08 举例说明 xff09 interface xff1a 接口 class 类 pu
  • myeclipse闪退的问题

    之前遇到myeclipse的闪退 xff0c 探索了之后 xff0c 找到了方法 xff0c 今天早上又遇到这种问题 xff0c 按照上次的方法尝试是没有问题的 决定和大家分享 删除 workspace xff08 工作空间 xff09 m
  • 【损失函数系列】softmax loss损失函数详解

    1 损失函数 xff1a 损失函数 xff08 loss function xff09 是用来评测模型的预测值f x 与真实值Y的相似程度 xff0c 损失函数越小 xff0c 就代表模型的鲁棒性越好 xff0c 损失函数指导模型学习 根据
  • JAVA从入门到精通(14)-- 包装类

    一 包装类 1 基本数据类型是不具备对象的特征的 xff0c 比如基本数据类型不能调用方法 功能简单 xff0c 为了让基本数据类型具备对象的特性 xff0c Java为每个基本数据类型提供了一个包装类 2 3 包装类主要提供了两大类方法
  • JAVA从入门到精通(16)-- Java版JSON入门

    一 JSON课程介绍 1 JSON是行业内使用最为广泛的数据传输格式 定义 xff1a JSON是一种与开发语言无关的 轻量级的数据格式 全称是JavaScript Object Notation 优点 xff1a 易于人的阅读和编写 xf
  • JAVA从入门到精通(17)-- GSON

    一 GSON介绍 1 介绍 xff1a GSON最早由Google提出的开源的项目 xff0c 主页在github上 xff0c 解析json 二 GSON生成JSON数据 1 加入依赖 xff0c 创建包和类 2 创建Gson对象 Man
  • JAVA从入门到精通(18)-- Servlet

    一 Servlet定义 1 现有JSP还是先有Servlet xff1f 先有的Servlet xff0c 因为JSP的前身就是Servlet 2 定义 xff1a Servlet是在服务器上运行的小程序 一个Servlet就是一个Java
  • pixhawk自学笔记之uorb学习总结

    注 xff1a 这是看过好多文章总结出来的 xff0c 转载了较多人的博客 xff0c 希望有知道原出处的人把地址留下 xff0c 我贴上来 在此谢谢各位前辈的总结 xff08 我会在后续笔记中贴出在我自己的程序中对于uorb的使用 xff
  • pixhawk自学笔记之px4程序启动顺序

    在了解px4启动之前我们需要了解一下bootloader Bootloader是在操作系统内核运行之前运行 xff0c 可以初始化硬件设备 xff0c 建立内存空间映射图等 xff0c 整个系统的加载启动任务就是完全由Bootloader来