NuttX


(嵌入式 实时操作系统 rtos nuttx 7.1 stm32 源代码分析)

NuttX 启动流程

转载请注明出处:http://blog.youkuaiyun.com/zhumaill/article/details/23261543


  1. __start--                                 #处理器执行的第一条指令  
  2.         |  
  3.         v  
  4.    stm32_clockconfig()------              #初始化时钟  
  5.                            |  
  6.                            v  
  7.                  rcc_reset()              #复位rcc  
  8.                  stm32_stdclockconfig()   #初始化标准时钟  
  9.                  rcc_enableperipherals()  #使能外设时钟  
  10.                            |  
  11.         --------------------  
  12.         |  
  13.         v  
  14.    stm32_fpuconfig()                      #配置fpu,shenzhou/nsh未调用  
  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()---------------              #初始化操作系统  
  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()  #初始化持有者结构以支持优先级继承,shenzhou/nsh未调用  
  40.                                   |  
  41.                            --------  
  42.                            |  
  43.                            v  
  44.                  up_allocate_heap()       #分配用户模式的堆(设置堆的起点和大小)  
  45.                  kumm_initialize()        #初始化用户模式的堆  
  46.                  up_allocate_kheap()      #分配内核模式的堆,shenzhou/nsh未调用  
  47.                  kmm_initialize()         #初始化内核模式的堆,shenzhou/nsh未调用  
  48.                  task_initialize()        #初始化任务数据结构,shenzhou/nsh未调用  
  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()    #初始化路由表,shenzhou/nsh未调用  
  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()  #初始化电源管理,shenzhou/nsh未调用  
  83.                        up_dmainitialize() #初始化DMA,shenzhou/nsh未调用  
  84.                        up_timerinit()     #初始化定时器中断  
  85.                        devnull_register() #注册/dev/null  
  86.                        devzero_register() #注册/dev/zero,shenzhou/nsh未调用  
  87.                        up_serialinit()    #注册串口控制台/dev/console和串口/dev/ttyS0  
  88.                        up_rnginitialize() #初始化并注册随机数生成器,shenzhou/nsh未调用  
  89.                        up_netinitialize() #初始化网络,是arch/arm/src/chip/stm32_eth.c中的  
  90.                        up_usbinitialize() #初始化usb驱动,shenzhou/nsh未调用  
  91.                        board_led_on()     #打开中断使能led,但很快会被其它地方的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()------       #创建初始任务  
  101.                                   |  
  102.                                   v  
  103.                        KEKERNEL_THREAD()  #启动内核工作者线程  
  104.                        board_initialize() #最后一刻的板级初始化,shenzhou/nsh未调用  
  105.                        TASK_CREATE()      #启动默认应用程序  
  106.                                   |  
  107.                            --------  
  108.                            |  
  109.                            v  
  110.                  for up_idle()            #空闲任务循环  
  111.                            |  
  112.         --------------------  
  113.         |  
  114.         v  
  115.    for(;;)                                #不应该到达这里  
__start--                                 #处理器执行的第一条指令
        |
        v
   stm32_clockconfig()------              #初始化时钟
                           |
                           v
                 rcc_reset()              #复位rcc
                 stm32_stdclockconfig()   #初始化标准时钟
                 rcc_enableperipherals()  #使能外设时钟
                           |
        --------------------
        |
        v
   stm32_fpuconfig()                      #配置fpu,shenzhou/nsh未调用
   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
                 board_led_initialize()   #初始化led,只是调用stm32_configgpio()设置gpio
                           |
        --------------------
        |
        v
   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()  #初始化持有者结构以支持优先级继承,shenzhou/nsh未调用
                                  |
                           --------
                           |
                           v
                 up_allocate_heap()       #分配用户模式的堆(设置堆的起点和大小)
                 kumm_initialize()        #初始化用户模式的堆
                 up_allocate_kheap()      #分配内核模式的堆,shenzhou/nsh未调用
                 kmm_initialize()         #初始化内核模式的堆,shenzhou/nsh未调用
                 task_initialize()        #初始化任务数据结构,shenzhou/nsh未调用
                 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()    #初始化路由表,shenzhou/nsh未调用
                       netdev_seminit()   #初始化网络设备信号量
                       arptimer_init()    #初始化ARP定时器
                                  |
                           --------
                           |
                           v
                 up_initialize()---       #处理器特定的初始化
                                  |
                                  v
                       up_calibratedelay()#校准定时器
                       up_addregion()     #增加额外的内存段
                       up_irqinitialize() #设置中断优先级,关联硬件异常处理函数
                       up_pminitialize()  #初始化电源管理,shenzhou/nsh未调用
                       up_dmainitialize() #初始化DMA,shenzhou/nsh未调用
                       up_timerinit()     #初始化定时器中断
                       devnull_register() #注册/dev/null
                       devzero_register() #注册/dev/zero,shenzhou/nsh未调用
                       up_serialinit()    #注册串口控制台/dev/console和串口/dev/ttyS0
                       up_rnginitialize() #初始化并注册随机数生成器,shenzhou/nsh未调用
                       up_netinitialize() #初始化网络,是arch/arm/src/chip/stm32_eth.c中的
                       up_usbinitialize() #初始化usb驱动,shenzhou/nsh未调用
                       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() #最后一刻的板级初始化,shenzhou/nsh未调用
                       TASK_CREATE()      #启动默认应用程序
                                  |
                           --------
                           |
                           v
                 for up_idle()            #空闲任务循环
                           |
        --------------------
        |
        v
   for(;;)                                #不应该到达这里



<think>好的,用户想查找在NuttX中查看串口波特率配置的方法。首先,我需要回忆一下NuttX系统的相关知识。NuttX是一个实时操作系统,常用于嵌入式设备,串口配置是其重要部分。 用户提到了使用串口调试工具,这可能涉及到NuttX的配置和命令行工具。记得NuttX提供了NSH(NuttShell)作为其命令行界面,用户可以通过串口终端访问。在NSH中,可能有相关的命令可以查看或配置串口参数,比如波特率。 接下来,我需要考虑NuttX的配置方式。通常,在NuttX中,串口的波特率是在板级配置文件里设置的,比如在`board.h`或者特定板子的配置文件中定义的。用户可能需要通过查看这些配置文件来确认波特率的值。此外,运行时是否可以通过某些命令或系统调用来获取当前波特率呢? 然后,想到NuttX的应用程序接口,比如使用`ioctl`系统调用来获取串口参数。例如,使用`TCGETS`命令来获取终端属性结构体,里面包含了波特率信息。不过用户可能需要编写简单的C程序来调用这些接口,或者在NSH中有现成的命令。 另外,参考用户提供的引用[1]中提到串口调试工具可以输出调试信息,可能NuttX有相关的命令可以直接输出当前串口配置,比如使用`stty`命令或者其他类似工具。不过需要确认NuttX的NSH是否支持这些命令。 再考虑具体的步骤:首先检查NSH是否有内置命令,比如`help`或者`stty`,然后查看配置文件的路径,如何通过代码或配置查看当前设置。如果NSH没有直接命令,可能需要通过编程方式调用接口,或者通过proc文件系统查看,如果有的话。 还需要注意用户可能没有编程环境,所以优先推荐通过NSH命令或配置文件查看。如果必须编程,给出示例代码。同时,引用相关的参考资料,比如用户提供的引用[1]关于串口调试工具,可能需要结合这些信息来完善答案。 总结步骤应该是:1. 使用NSH命令;2. 查看配置文件;3. 编程方法获取。需要检查这些方法的可行性,并确保语法和路径正确。例如,确认NuttX是否启用了`FIONREAD`或相关ioctl命令的支持,这可能影响能否通过系统调用获取波特率。 最后,生成相关问题,覆盖配置方法、运行时修改、相关工具使用等,帮助用户进一步探索。</think>### NuttX查看串口波特率配置方法 #### 方法一:通过NSH命令行查询 1. **登录NuttX的NSH终端** 通过串口调试工具(如Putty、Minicom)连接目标设备,进入NuttX的交互式命令行界面(NSH)。 2. **使用`stty`命令查看当前配置** 输入命令: ```bash stty -F /dev/ttyS0 ``` 其中`/dev/ttyS0`为需要查询的串口设备路径,输出结果中将包含波特率(如`speed 115200`)[^1]。 #### 方法二:查看板级配置文件 NuttX的串口波特率通常在板级配置中定义。 1. 打开对应开发板的配置文件(如`nuttx/boards/<架构>/<板型>/include/board.h`)。 2. 搜索宏定义`CONFIG_<UART编号>_BAUD`,例如: ```c #define CONFIG_UART0_BAUD 115200 ``` 此值即为默认波特率配置。 #### 方法三:通过编程接口获取 在应用程序中调用`ioctl`函数获取串口属性: ```c #include <termios.h> struct termios tio; int fd = open("/dev/ttyS0", O_RDWR); ioctl(fd, TCGETS, &tio); printf("波特率:%d\n", (int)cfgetospeed(&tio)); close(fd); ``` 此代码通过`TCGETS`命令从终端属性结构体中读取波特率值[^1]。 #### 验证方法 - **动态修改测试** 使用`stty`命令临时修改波特率并验证通信: ```bash stty -F /dev/ttyS0 57600 ``` 若通信正常,则配置生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值