系统启动
启动文件 : 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:留待扩展