PX4飞控学习(四)

系统启动

启动文件 : nuttx/arch/arm/stm32/stm32_start.c

stm32_clockconfig(); //时钟
stm32_fpuconfig();   //fpu
stm32_lowsetup();    //低级的串口通信 显示每次启动显示的”ABCD“
stm32_gpioinit();    //仅f10系列起作用
showprogress('A');   //输出 A

for (dest = &_sbss; dest < &_ebss; )
    {
      *dest++ = 0;
    }
 showprogress('B');
 //清除.bss。 B未显示 不知道为什么 
 for (src = &_eronly, dest = &_sdata; dest < &_edata; )
    {
      *dest++ = *src++;
    }

showprogress('C');
//启动数据进入内存 打印 C
up_earlyserialinit();
//初始化uart驱动
stm32_boardinitialize();
//板级启动函数nuttx的时候在config/nsh/src 目录下定义 , px4在 //src/driver/board/px4fmu-v2/ 目录
os_start();
//系统启动。

系统文件 nuttx/sched/os_start.c


dq_init(&g_readytorun);
dq_init(&g_pendingtasks);
dq_init(&g_waitingforsemaphore);
#ifndef CONFIG_DISABLE_SIGNALS
  dq_init(&g_waitingforsignal);
#endif
#ifndef CONFIG_DISABLE_MQUEUE
 dq_init(&g_waitingformqnotfull);
 dq_init(&g_waitingformqnotempty);
 #endif
#ifdef CONFIG_PAGING
  dq_init(&g_waitingforfill);
#endif
  dq_init(&g_inactivetasks);
  sq_init(&g_delayed_kufree);
#if defined(CONFIG_NUTTX_KERNEL) && defined(CONFIG_MM_KERNEL_HEAP)
  sq_init(&g_delayed_kfree);
//启动 rtos数据 启动任务链表
然后初始化一个g_idletcb结构 指向 os_start name=”Idle task” 
/* Then add the idle task's TCB to the head of the ready to run list */
dq_addfirst((FAR dq_entry_t*)&g_idletcb, (FAR dq_queue_t*)&g_readytorun);
  /* Initialize the processor-specific portion of the TCB */
up_initial_state(&g_idletcb.cmn);
sem_initialize();
// 初始化信号灯
up_allocate_heap(&heap_start, &heap_size);
kumm_initialize(heap_start, heap_size);
//初始化内存管理器
irq_initialize();
//初始化中断
wd_initialize();
// 看门狗
clock_initialize();
//时钟
timer_initialize();
//时间
sig_initialize();
//信号? 这里未了解
mq_initialize();
//消息队列
  pthread_initialize();
//线程
 fs_initialize();
//文件系统
up_initialize();

系统级启动文件 nuttx/arch/arm/src/common/up_initialize.c

校准时间 → 添加外部内存 → 启动irq中断子系统 → 启动DMA → 启动系统时钟中断 → 创建 /dev/null设备 → 添加uart设备 产生/dev/ttySx 文件 → 网络启动 → usb启动 → 灯

//添加库链接 具体怎么用 不太明白 px4该函数为空
lib_initialize();

DEBUGVERIFY(group_allocate(&g_idletcb));
//分配 IDLE 组

 /* Complete initialization of the IDLE group.  Suppress retention
   * of child status in the IDLE group.
   */

#ifdef HAVE_TASK_GROUP
  DEBUGVERIFY(group_initialize(&g_idletcb));
  g_idletcb.cmn.group->tg_flags = GROUP_FLAG_NOCLDWAIT;
#endif

  DEBUGVERIFY(os_bringup());
//启动系统Nuttx/sched/os_bringup.c
//开启两个线程 高优先级线程 及 低优先级线程 work_hpthread/ work_lpthread
//启动 nsh_main
apps/example/nsh_main.c
apps/nshlib/nsh_init.c

up_cxxinitialize();
//cxx库支持
builtin_initialize();
//外挂命令
nsh_initialize();
nsh_romfsetc();
//挂载 ROMFS 
nsh_archinitialize(); 
//nuttx系统在 configs/bamboo/nsh/src 中写
px4 在 /src/drivers/boards/bamboo中 
//基本上启动 spi i2c sd等等设备
nsh_consolemain(0, NULL);
//启动 init.d/rcS 启动文件 
//至此 系统启动完毕

飞行器状态说明:

HIL:硬件环在线模拟使能。所有发动机、舵机及其他动作设备阻断,但内部软
件处于全部可操作状态。

SAFETY_ARMED:主发动机使能,怠速。准备好起飞。

MANUAL_INPUT_ENABLED:遥控输入信号使能。

STABILIZE_ENABLED:高度/位置电子增稳使能。在此状态下,飞行器仍需要外部操作指令以实现操作。

GUIDED_ENABLED:导航使能。导航数据和指令来自导航/航点指令表文件。

AUTO_ENABLED:全自主航行模式使能。系统自行决定目的地。前一项“导航使能”可以设置为0 或1 状态,这取决于具体的应用。

TEST_ENABLED:测试模式使能。本标识仅供临时的系统测试之用,不应该用于实际航行的应用中。

CUSTOM_MODE_ENABLED:留待扩展

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orbz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值