以下代码basiaclly允许使用LED访问GPIO端口。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
int main(int argc, char *argv[])
{
extern char *optarg;
char *cptr;
int gpio_value = 0;
int nchannel = 0;
int c;
int i;
opterr = 0;
while ((c = getopt(argc, argv, "g:io:ck")) != -1) {
switch (c) {
case 'g':
gl_gpio_base = (int)strtoul(optarg, &cptr, 0);
if (cptr == optarg)
usage(argv[0]);
break;
case 'i':
gpio_opt = IN;
break;
case 'o':
gpio_opt = OUT;
gpio_value = (int)strtoul(optarg, &cptr, 0);
if (cptr == optarg)
usage(argv[0]);
break;
case 'c':
gpio_opt = CYLON;
break;
case 'k':
gpio_opt = KIT;
break;
case '?':
usage(argv[0]);
default:
usage(argv[0]);
}
}
if (gl_gpio_base == 0) {
usage(argv[0]);
}
nchannel = open_gpio_channel(gl_gpio_base);
signal(SIGTERM, signal_handler); /* catch kill signal */
signal(SIGHUP, signal_handler); /* catch hang up signal */
signal(SIGQUIT, signal_handler); /* catch quit signal */
signal(SIGINT, signal_handler); /* catch a CTRL-c signal */
switch (gpio_opt) {
case IN:
set_gpio_direction(gl_gpio_base, nchannel, "in");
gpio_value=get_gpio_value(gl_gpio_base, nchannel);
fprintf(stdout,"0x%08X\n", gpio_value);
break;
case OUT:
set_gpio_direction(gl_gpio_base, nchannel, "out");
set_gpio_value(gl_gpio_base, nchannel, gpio_value);
break;
case CYLON:
#define CYLON_DELAY_USECS (10000)
set_gpio_direction(gl_gpio_base, nchannel, "out");
for (;;) {
for(i=0; i < ARRAY_SIZE(cylon); i++) {
gpio_value=(int)cylon[i];
set_gpio_value(gl_gpio_base, nchannel, gpio_value);
}
usleep(CYLON_DELAY_USECS);
}
case KIT:
#define KIT_DELAY_USECS (10000)
set_gpio_direction(gl_gpio_base, nchannel, "out");
for (;;) {
for (i=0; i<ARRAY_SIZE(kit); i++) {
gpio_value=(int)kit[i];
set_gpio_value(gl_gpio_base, nchannel, gpio_value);
}
usleep(KIT_DELAY_USECS);
}
default:
break;
}
close_gpio_channel(gl_gpio_base);
return 0;
}
Genarlly我会发出这样的命令;
gpio-demo -g 255 -o 0
上面的255告诉我芯片编号,000告诉我哪些数据将进入GPIO端口。
这将关闭所有LED。
然而,出于某些调试目的,我必须修改此代码,使其行为不同:
当运行程序时,tt应该只是关闭LED,即运行以下命令。
gpio-demo -g 255 -o 0
这是唯一可以进行硬编码的命令。 ON LED现在将关闭。
我尝试的是将命令作为main中的第一行插入:
int main(int argc, char *argv[])
{
argv = "gpio-demo -g 255 -o 0" //irrespective of what user what user type, run this command. gpio-demo is the binary of this program
.
.
.
.
}
这是硬编码命令行参数的正确方法吗?
答案 0 :(得分:2)
如果你打电话给你这样的程序gpio-demo -g 255 -o 0
,那么argc
将等于5
而argv
将是一个包含五个指向字符序列的指针的列表。第一个是gpio-demo
,第二个是-g
,第三个是255
,...
因此,如果你真的想硬编码,你必须写:
argc = 5;
argv = (char**)malloc(sizeof(char*)*argc);
argv[0] = "gpio-demo";
argv[1] = "-g";
argv[2] = "255";
argv[3] = "-o";
argv[4] = "0";
但是,我不推荐这个!而是使用带有所需命令行的bash脚本。