第二章 第4节 在ucos上实现int main(int argc, char *argv[])功能-闫刚


 最近工作很繁忙,没太多时间想博客的事情,但是今天还是亲不自禁要和大家分享我最新写的代码!!!!

linux下对main函数说明:”每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点。当执行程序时,命令行参数(command-line argument)(由shell逐一解析)通过两个入参提供给main()函数。第一个参数int argc,表示命令行参数的个数。第二个参数char *argv[],是一个指向命令行参数的指针数组,每一参数又都是以空字符(null) 结尾的字符串。第一个字符串,亦即argv[0]指向的,(通常)是该程序的名称。argv中的指针列表以NULL指针结尾(即argv[argc]为NULL)”

通过argc, argv我们就可以实现很方便,操作当前线程,今天,我就把这个机制在ucos上实现。 先上干活

1. 手动给字符串指针赋值

/**
* 为了模拟main函数的参数传入, 我们手动把字符串写好,比如下面
* "shell start" 这样我们就调用sheel_main()函数,同时传递参数start,启动
* 线程
*/
char * sheel_argv_str[ 5 ] = { "sheel" , "start" };
arg_desc_t sheel_argv = {
    . argc = 2 ,
    . argv = sheel_argv_str
}; 

2. main函数入口调用

     // 传入上面赋值好的参数个数,字符串参数列表 "sheel start"
     sheel_main (sheel_argv. argc , sheel_argv. argv );


3.  sheel_main的实现

下面代码才是让人窒息的思想, 完全模仿linux风格,如果是搞过px4的同学,就更新熟悉这种函数入口方式了!!

int sheel_main ( int argc, char * argv[])
{
     if (argc < 2 ) {
         return - 1 ;
    }
    
     if ( ! strcmp (argv[ 1 ], "start" )) {        
         /* 调用ucos的任务创建函数OSTaskCreate 创建任务 */
         OSTaskCreate (UART_task, ( void * ) 0 , (OS_STK * ) & UART_TASK_STK[UART_STK_SIZE - 1 ], UART_TASK_PRIO);
         return 0 ;
    }

     if ( ! strcmp (argv[ 1 ], "stop" )) {     
         OSTaskDel (UART_TASK_PRIO);
         return 0 ;
    }

     if ( ! strcmp (argv[ 1 ], "info" )) {     
         sheel_info ();
         return 0 ;
    }
     return 0 ;
}


这样,我们就轻松在ucos上实现类似linux风格的main函数入口的思想,这个思想值得我们学习,小编,就讲到这里,下期再见

猜你喜欢

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