微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > LED例程分析,为后续做准备

LED例程分析,为后续做准备

时间:10-02 整理:3721RD 点击:

LED是对GPIO操作的基本功能。其操作方式也是有多种的,例如在终端中使用echo命令、通过源文件对应数据手册操作寄存器,使用第三方库(python)等等,但是当打工米尔的例程时,会发现看似使用用源文件的形式,其实是使用echo的方式,使用system函数执行shell 命令。

system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

定义函数
        intsystem(const char * string);

返回值
=-1:出现错误
=0:调用成功但是没有出现子进程
>0:成功退出的子进程的id
        如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>。
如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功。
附加说明
        在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

先列出LED的例程:

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include

  7. //#define DEBUG        1

  8. #define        KEY_DEV                        "/dev/input/by-path/platform-gpio_keys.8-event"
  9. #define PLAY_KEY        102

  10. #define ARRAY_SIZE(x)        (sizeof(x)/sizeof(x[0]))

  11. #define LED_DELAY_US        (200*1000) /* 200 ms */

  12. #ifdef DEBUG
  13. #define dbg_info(fmt, args...)                printf(fmt, #args)
  14. #else
  15. #define dbg_info(fmt, args...)
  16. #endif

  17. #define dbg_err(fmt, args...)                printf(fmt, #args)


  18. typedef struct gpio_s {
  19.         int gpio;
  20.         char value_path[64];
  21.         char dir_path[64];
  22.         int value;
  23. }gpio_t;

  24. static const char *leds[] =
  25.         {
  26.                 "/sys/class/leds/status_led1/brightness",
  27.                 "/sys/class/leds/status_led2/brightness",
  28.                 "/sys/class/leds/status_led3/brightness",
  29.         };

  30. void leds_ctrl(const char **leds, int count, unsigned int status)
  31. {
  32.         int i = 0;
  33.         char cmd[128] = {0};
  34.         static unsigned int pre_status = 0;/* It was on by default */

  35.         for (i = 0; i %s", !(status&(1 32) {
  36.                 dbg_err("too many leds!(%d, expected > (count -1))&0x1);
  37.         }

  38. }

  39. int main (int argc, char *argv[])
  40. {
  41.         int keys_fd;
  42.         char ret[2];
  43.         struct input_event t[2];
  44.         fd_set fds;
  45.         struct timeval tv;

  46.         leds_ctrl(leds, ARRAY_SIZE(leds), 0xF);
  47.         usleep(LED_DELAY_US);
  48.     leds_ctrl(leds, ARRAY_SIZE(leds), 0);
  49.        
  50.         leds_play(leds, ARRAY_SIZE(leds));
  51.        
  52.         return 0;
  53. }

复制代码

上面程序去掉了按键的部分。从程序中可以看到,将三个LED的设置在leds数据中,当对于某一LED进行操作时,使用sprintf函数将具体的参数与leds中的设备进行组合,生成不同的操作命令,这个操作命令存储在cmd字符串数组中,再使用system函数去支持这个操作命令。以达到操作LED上的GPIO的目的。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top