免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7582 | 回复: 14

[驱动] 单片机开发转入linux驱动 [复制链接]

论坛徽章:
0
发表于 2014-07-14 08:58 |显示全部楼层
   自己已经工作3年了,一直在做嵌入式的工作,但是使用的平台基本都是单片机、cortexM系列,系统也都是裸机,对于操作系统没有实际的项目经验。
   自己业余时间只在stm32上简单使用过ucos操作系统。一直以来都想涉足linux驱动或者内核相关的工作,但是感觉总是没有机会,在网上找一些招聘信息,人家总是希望找一些有相关工作经验的,可是自己的情况感觉不满足。
  真的对操作系统非常感兴趣,但是不知道该从何入手,这些年也就一直围绕在一些入门级别的资料和数据周围....感觉自己也慢慢年龄大了,希望自己能尽快脱离这种状态....真心希望得到前辈们的指点!

   qq:903937429

论坛徽章:
0
发表于 2014-07-20 01:16 |显示全部楼层
这里高手很多,常来泡泡就学到不少东西。

论坛徽章:
1
2015亚冠之胡齐斯坦钢铁
日期:2015-05-27 17:00:29
发表于 2014-07-20 22:49 |显示全部楼层
我 也 要 追赶 :wink::wink::wink:

论坛徽章:
1
2015亚冠之胡齐斯坦钢铁
日期:2015-05-27 17:00:29
发表于 2014-07-20 22:50 |显示全部楼层
今年刚毕业 找到了一个  设计  很少的公司      真的我 好想学技术

论坛徽章:
1
2015亚冠之胡齐斯坦钢铁
日期:2015-05-27 17:00:29
发表于 2014-07-20 22:50 |显示全部楼层
我加你  qq  好吗    请教请教前辈

论坛徽章:
0
发表于 2014-07-21 13:33 |显示全部楼层
大家彼此交流一下,比较好,自己也很困惑

论坛徽章:
0
发表于 2014-07-31 10:50 |显示全部楼层
买套开发板,先研究一下

论坛徽章:
0
发表于 2014-09-22 11:24 |显示全部楼层
恩,感谢各位的指点和恢复;自己整了一个tq2440的开发板,在慢慢的摸索;做以下打算:

1、自己先简单的根据开发板上的资料把linux开发环境搭建起来;
2、尝试做一些开源软件的移植和应用实现的相关内容(比如面mjpg-streamer);
3、读一下一些简单驱动的移植代码,尝试自己添加一些简单的驱动模块,熟悉linux驱动添加的基本方法;

在心底里埋了这么就的linux梦,现在算是开始慢慢启动了;希望坛子里的前辈、同仁多多指导!

论坛徽章:
0
发表于 2014-09-24 09:31 |显示全部楼层
目前根据TQ2440开发板的源码已经搭建好基本的嵌入式linux平台;试图读懂并且定制自己想要的网络摄像机功能,当然主要是linux平台上的C代码;但是遇到一些问题
1、对于linux C变成中用到的一些库函数(不知道这样说是不是恰当)比较陌生,不知道其具体作用,源码读起来比较吃力,比如“getopt_long_only()”、“dlopen”、“dlsym”;
2、对于linux系统下应用程序执行的过程比较模糊;比如说:以前在裸机上去开发,程序一般都是顺序执行外加一些异常处理;在linux的平台下面,有时候弄不清楚一段代码怎么执行到,比如在一个main函数中,有一个while(1),在while(1)的后面还有一些代码,实际运行的时候,后面的这部分代码确实运行到了(打印结果看到),但是不能理解他是怎么执行到的。


int main(int argc, char *argv[])
{
  char *input  = "input_uvc.so --resolution 640x480 --fps 5 --device /dev/video0";
  char *output[MAX_OUTPUT_PLUGINS];
  int daemon=0, i;
  size_t tmp=0;

  output[0] = "output_http.so --port 8080";
  global.outcnt = 0;

  global.control = control;

  /* parameter parsing */
  while(1) {
    int option_index = 0, c=0;
    static struct option long_options[] = \
    {
      {"h", no_argument, 0, 0},
      {"help", no_argument, 0, 0},
      {"i", required_argument, 0, 0},
      {"input", required_argument, 0, 0},
      {"o", required_argument, 0, 0},
      {"output", required_argument, 0, 0},
      {"v", no_argument, 0, 0},
      {"version", no_argument, 0, 0},
      {"b", no_argument, 0, 0},
      {"background", no_argument, 0, 0},
      {0, 0, 0, 0}
    };

    c = getopt_long_only(argc, argv, "", long_options, &option_index);

    /* no more options to parse */
    if (c == -1) break;

    /* unrecognized option */
    if(c=='?'){ help(argv[0]); return 0; }

    switch (option_index) {
      /* h, help */
      case 0:
      case 1:
        help(argv[0]);
        return 0;
        break;

      /* i, input */
      case 2:
      case 3:
        input = strdup(optarg);
        break;

      /* o, output */
      case 4:
      case 5:
        output[global.outcnt++] = strdup(optarg);
        break;

      /* v, version */
      case 6:
      case 7:
        printf("MJPG Streamer Version: %s\n" \
               "Compilation Date.....: %s\n" \
               "Compilation Time.....: %s\n", SOURCE_VERSION, __DATE__, __TIME__);
        return 0;
        break;

      /* b, background */
      case 8:
      case 9:
        daemon=1;
        break;

      default:
        help(argv[0]);
        return 0;
    }
  }

  
  openlog("MJPG-streamer ", LOG_PID|LOG_CONS, LOG_USER);
  //openlog("MJPG-streamer ", LOG_PID|LOG_CONS|LOG_PERROR, LOG_USER);
  syslog(LOG_INFO, "starting application");

  /* fork to the background */
  if ( daemon ) {
    LOG("enabling daemon mode");
    daemon_mode();
  }

  /* initialise the global variables */
  global.stop      = 0;
  global.buf       = NULL;
  global.size      = 0;
  global.in.plugin = NULL;

  /* this mutex and the conditional variable are used to synchronize access to the global picture buffer */
  if( pthread_mutex_init(&global.db, NULL) != 0 ) {
    LOG("could not initialize mutex variable\n");
    closelog();
    exit(EXIT_FAILURE);
  }
  if( pthread_cond_init(&global.db_update, NULL) != 0 ) {
    LOG("could not initialize condition variable\n");
    closelog();
    exit(EXIT_FAILURE);
  }

  /* ignore SIGPIPE (send by OS if transmitting to closed TCP sockets) */
  signal(SIGPIPE, SIG_IGN);

  /* register signal handler for <CTRL>+C in order to clean up */
  if (signal(SIGINT, signal_handler) == SIG_ERR) {
    LOG("could not register signal handler\n");
    closelog();
    exit(EXIT_FAILURE);
  }

  /*
   * messages like the following will only be visible on your terminal
   * if not running in daemon mode
   */
  LOG("MJPG Streamer Version.: %s\n", SOURCE_VERSION);

  /* check if at least one output plugin was selected */
  if ( global.outcnt == 0 ) {
    /* no? Then use the default plugin instead */
    global.outcnt = 1;
  }

  /* open input plugin */
  tmp = (size_t)(strchr(input, ' ')-input);
  global.in.plugin = (tmp > 0)?strndup(input, tmp):strdup(input);
  global.in.handle = dlopen(global.in.plugin, RTLD_LAZY);
  if ( !global.in.handle ) {
    LOG("ERROR: could not find input plugin\n");
    LOG("       Perhaps you want to adjust the search path with:\n");
    LOG("       # export LD_LIBRARY_PATH=/path/to/plugin/folder\n");
    LOG("       dlopen: %s\n", dlerror() );
    closelog();
    exit(EXIT_FAILURE);
  }
  global.in.init = dlsym(global.in.handle, "input_init");
  if ( global.in.init == NULL ) {
    LOG("%s\n", dlerror());
    exit(EXIT_FAILURE);
  }
  global.in.stop = dlsym(global.in.handle, "input_stop");
  if ( global.in.stop == NULL ) {
    LOG("%s\n", dlerror());
    exit(EXIT_FAILURE);
  }
  global.in.run = dlsym(global.in.handle, "input_run");
  if ( global.in.run == NULL ) {
    LOG("%s\n", dlerror());
    exit(EXIT_FAILURE);
  }
  /* try to find optional command */
  global.in.cmd = dlsym(global.in.handle, "input_cmd");

  global.in.param.parameter_string = strchr(input, ' ');
  global.in.param.global = &global;

  if ( global.in.init(&global.in.param) ) {
    LOG("input_init() return value signals to exit");
    closelog();
    exit(0);
  }

  /* open output plugin */
  for (i=0; i<global.outcnt; i++) {
    tmp = (size_t)(strchr(output, ' ')-output);
    global.out.plugin = (tmp > 0)?strndup(output, tmp):strdup(output);
    global.out.handle = dlopen(global.out.plugin, RTLD_LAZY);
    if ( !global.out.handle ) {
      LOG("ERROR: could not find output plugin %s\n", global.out.plugin);
      LOG("       Perhaps you want to adjust the search path with:\n");
      LOG("       # export LD_LIBRARY_PATH=/path/to/plugin/folder\n");
      LOG("       dlopen: %s\n", dlerror() );
      closelog();
      exit(EXIT_FAILURE);
    }
    global.out.init = dlsym(global.out.handle, "output_init");
    if ( global.out.init == NULL ) {
      LOG("%s\n", dlerror());
      exit(EXIT_FAILURE);
    }
    global.out.stop = dlsym(global.out.handle, "output_stop");
    if ( global.out.stop == NULL ) {
      LOG("%s\n", dlerror());
      exit(EXIT_FAILURE);
    }
    global.out.run = dlsym(global.out.handle, "output_run");
    if ( global.out.run == NULL ) {
      LOG("%s\n", dlerror());
      exit(EXIT_FAILURE);
    }
    /* try to find optional command */
    global.out.cmd = dlsym(global.out.handle, "output_cmd");

    global.out.param.parameter_string = strchr(output, ' ');
    global.out.param.global = &global;
    global.out.param.id = i;
    if ( global.out.init(&global.out.param) ) {
      LOG("output_init() return value signals to exit");
      closelog();
      exit(0);
    }
  }

  /* start to read the input, push pictures into global buffer */
  DBG("starting input plugin\n");
  syslog(LOG_INFO, "starting input plugin");
  if ( global.in.run() ) {
    LOG("can not run input plugin\n");
    closelog();
    return 1;
  }

  DBG("starting %d output plugin(s)\n", global.outcnt);
  for(i=0; i<global.outcnt; i++) {
    syslog(LOG_INFO, "starting output plugin: %s (ID: %02d)", global.out.plugin, global.out.param.id);
    global.out.run(global.out.param.id);
  }

  /* wait for signals */
  pause();

  return 0;
}



目前的情况:
对于问题1,函数的功能在网上很容易了解到,只是多花点时间在相关函数的熟悉上,这个倒不是问题。

但是对于问题2,自己目前比较困惑。当然是自己刚刚接触这一块内容不熟悉无可厚非,但是必须想一个办法去解决;当前自己有两个方面的打算:
1、想买一些操作系统原理方面的书籍,仔细的读一读,希望各位前辈指点一下,有哪些书比较好(我知道有一个《操作系统原理Linux篇》,不过网上好像都缺货了);
2、继续去看一些实际的源码,不懂的地方来坛子里问,到网上查,不明白的地方坚决弄明白;

论坛徽章:
0
发表于 2014-09-24 14:32 |显示全部楼层
本帖最后由 jn_song 于 2014-09-24 16:50 编辑

前面提到while(1)后面的代码如何执行到的问题。“c = getopt_long_only(argc, argv, "", long_options, &option_index);”原来如果c=-1的时候就说明,argv里面的参数全部已经解析完毕了,接下来就是“if (c == -1) break;”这样就跳出这个while(1)循环了。

闹笑话了....哈哈哈。因为刚开始学习linux太不熟悉了,不过程序从上到下顺序执行不会变,自己蒙圈了.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP