第三章 第五节 px4 nuttx标准输入,标准输出,标准错误实现原理

在这里插入图片描述
标准输入,标准输出,标准错误,也算是编程基础了,我讲一讲这功能在nuttx的os实现过程

1. linux重定向, 通道重定向符号,写入1个字符到hello.txt文件中

$ echo "abc" > hello.txt 
$ cat hello.txt
    abc

2. nuttx os start如何启动内核线程的

 void os_start(void)
   创建空闲任务
   ->   g_pidhash[ PIDHASH(0)].tcb = &g_idletcb.cmn;
        g_pidhash[ PIDHASH(0)].pid = 0;
  
   创建标注输入标准输入标准错误
   ->  group_setupidlefiles(&g_idletcb)); 
     -> fd = open("/dev/console", O_RDWR);
      (void)fs_dupfd2(0, 1);
      (void)fs_dupfd2(0, 2);
   创建队列线程
   -> void)work_hpstart();
   -> (void)work_lpstart();
   -> os_do_appstart()
      -> board_initialize();
  创建init线程,其实就是insh线程
      -> pid = task_create("init", SCHED_PRIORITY_DEFAULT,
                        CONFIG_USERMAIN_STACKSIZE, USERSPACE->us_entrypoint,
                        (FAR char * const *)NULL);

3. task_creath介绍

每个线程创建的时候,会自动的复制父进程的文件句柄,这种克隆方式是一种继承思想

static int thread_create(FAR const char *name, uint8_t ttype, int priority,
                         int stack_size, main_t entry, FAR char * const argv[])
group_setuptaskfiles(FAR struct task_tcb_s *tcb)
  -> sched_dupfiles(tcb);
  -> group_setupstreams(tcb);
      ->(void)fs_fdopen(0, O_RDONLY,         (FAR struct tcb_s *)tcb);
      ->(void)fs_fdopen(1, O_WROK | O_CREAT, (FAR struct tcb_s *)tcb);
      ->(void)fs_fdopen(2, O_WROK | O_CREAT, (FAR struct tcb_s *)tcb);

4. rcS启动nshterm线程后,为什么控制台被重定向,线程需要stop,然后start才能看到调试信息

rcS:
 nshterm /dev/ttyACM0 &  /dev/ttyACM0作为新的控制台
 thread1 start 
 thread2 start 
 thread3 start 

当我们控制其切换到其他控制台的时候,我们rcs中的线程都已经启动,所以需要我们先对线程stop, 后进行start, 任务创建的时候会自动继承nsh标准输入标注输出。

提出一个标准输入和标准输出是阻塞式设计还是非阻塞?

#define O_RDONLY    (1 << 0)       
#define O_RDOK      O_RDONLY       
#define O_WRONLY    (1 << 1)        
#define O_WROK      O_WRONLY        
#define O_RDWR      (O_RDOK|O_WROK) 
#define O_CREAT     (1 << 2)        
#define O_EXCL      (1 << 3)       
#define O_APPEND    (1 << 4)        
#define O_TRUNC     (1 << 5)        
#define O_NONBLOCK  (1 << 6)        
#define O_NDELAY    O_NONBLOCK      
#define O_SYNC      (1 << 7)        
#define O_DSYNC     O_SYNC          
#define O_BINARY    (1 << 8)       

fd = open("/dev/console", O_RDWR);
可以看出标准输入和标准输出都是阻塞式设计,

猜你喜欢

转载自blog.csdn.net/yangang185/article/details/85262740