我在基于ARM的linux板(imx233 CPU)上使用3.12内核.我的目的是检测GPIO的引脚变化(1到0).
我可以不断调用下面的函数读取引脚值(在while(1)循环中)
int GPIO_read_value(int pin){
int gpio_value = 0;
char path[35] = {'\0'};
FILE *fp;
sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
//error
}
fscanf(fp, "%d", &gpio_value);
fclose(fp);
return gpio_value;
}
Run Code Online (Sandbox Code Playgroud)
但它会给CPU带来太多负载.我不使用usleep
或nanosleep
,因为引脚更改发生的时间很短,导致我错过了该事件.
据我所知,它是不可能使用的poll()
.有没有poll()
类似的功能可以用来检测GPIO的引脚变化?
编辑:以防万一,如果我做错了什么,这是我的poll()
用法没有检测到引脚更改
struct pollfd pollfds;
int fd;
int nread, result;
pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
int timeout = 20000; /* Timeout in msec. */
char buffer[128];
if( pollfds.fd < 0 ){
printf(" …
Run Code Online (Sandbox Code Playgroud) 我正在用Linux环境下的C编写一个程序(Debian-Lenny),并且希望在有更新时更新程序(当有新的更新时程序会收到通知).我正在寻找程序可以自我更新的方法.
我在想的是主程序调用一个新程序来处理更新.updater程序将拥有(访问)源代码并接收有关源代码更改的更新信息,如下所示:
edit1: line 20, remove column 5 to 20;
edit2: line25, remove column 4-7 then add "if(x>3){" from the column4
edit3: line 26, enter a new line and insert "x++;"
Run Code Online (Sandbox Code Playgroud)
然后杀死主进程,重新编译源代码,然后用旧的二进制文件替换新的二进制文件.
或者是否有更好(更简单)和标准的方式来实现程序可以自行更新的能力?
我使用该程序来控制具有Linux嵌入式主板的系统.因此,我不希望其他人可以访问源代码(如果系统被黑客攻击或其他东西).如果使用源代码更新程序的最佳方法,您如何建议我保护源代码?如果您建议我加密源代码,程序可以使用什么功能(Linux C)来加密和解密源文件?
我正在寻找可以在C中使用的函数/系统调用来管理Linux机器的网络接口.例如,我想做ip link set wlan0 down
(或向上)或者ifconfig wlan0 down
除了什么功能之外还可以使用它system()
?
我在Linux(Debian)上开发了一个C代码.有时,我需要执行一些命令system()
我想知道是否可以通过system()
root 执行命令.如果不是这样,是否有任何函数可以以root身份执行命令(或运行二进制文件),我可以在C代码上使用它?
我的目的是在while
规定的时间内执行循环(例如,本例中为90秒).它不一定是90秒,但1-2秒的不准确是可以接受的.为了这个目的,我试图使用clock()`函数:
int main(void){
clock_t start, end;
volatile double elapsed;
start = clock();
int terminate = 1;
while(terminate)
{
end = clock();
elapsed = ((double) (end-start)) / (double) CLOCKS_PER_SEC *1000;
printf("elapsed time:%f\n",elapsed);
if(elapsed >= 90.0)
terminate = 0;
usleep(50000);
}
printf("done..\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在我的笔记本电脑上运行它(x86,3.13内核,gcc 4.8.2)时,我的秒表测量它完成72秒.(1000 elapsed
我的笔记本电脑必须具有几秒钟的准确度)
当我在ARM设备(armv5tejl,3.12内核,gcc 4.6.3)上运行它时,需要58秒才能完成代码.(我需要使用100
上elapsed
对的ARMv5).
我在室温下运行代码,因此时钟应该稳定.我知道内核会休眠线程,并且有时间不准确地唤醒它们等等.因此,正如我之前所说,我不希望得到一个完美的时序,但它应该有一些准确性.
我曾试图只使用usleep
(偶数nanosleep
),但分辨率也不好.最后,我想出了获取系统时间(小时,分钟,秒)的底部代码,然后计算经过的时间.并且它具有良好的准确性.
我想知道是否有另一种解决方案使用成本更低?
typedef struct{
int hour;
int minute;
int second;
} timeInfo;
timeInfo getTimeInfo(void){
timeInfo value2return; …
Run Code Online (Sandbox Code Playgroud) 函数asprintf()和vasprintf()是sprintf(3)和vsprintf(3)的类似函数,除了它们分配一个足够大的字符串来保存包括终止空字节的输出,并通过第一个参数返回指向它的指针.应该将此指针传递给free(3)以在不再需要时释放已分配的存储.
这是我的C代码
void function(){
char *out = NULL;
int parts[16] = {1,2,05,003};
asprintf(&out, "%d.%d.%d.%d", parts[0], parts[1], parts[2], parts[3]);
// free(out);
}
int main(void){
function();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当在调试模式下监视该函数时,我看到该变量在从函数返回时已被销毁.为什么我不需要free()
上面的代码?
你能告诉我在什么情况下asprintf
我需要免费使用吗?
顺便说一句,我有"gcc版本4.7.2(Ubuntu/Linaro 4.7.2-2ubuntu1)"
inline
在另一个问题上使用指令有很好的解释
谁能解释一下在头文件上使用inline
和有什么区别__always_inline
吗?
而且,什么时候我更喜欢而__always_inline
不是inline
相反?
我有一个嵌入式系统(没有任何操作系统的MCU),最终用户应该能够定义系统的级别(比例:0-100)一年.作为一个例子(时间x天矩阵):
| 1st Jan | 2nd Jan | 3rd Jan | .. | 31 Dec |
00:30 | 40 (%) | 40 | 45 | .. | 50 |
01:48 | 48 | 47 | 55 | .. | 33 |
02:26 | 64 | 64 | 60 | .. | 68 |
.. | .. | .. | .. | .. | .. |
22:15 | 79 | 82 | 89 | .. | 100 |
23:37 | 100 …
Run Code Online (Sandbox Code Playgroud) 使用三元运算符是否存在任何性能或内存明智优势(反之亦然)?例如下面的案例:
int x=0, y=1, z=2, a=0;
a= x ? y : z;
Run Code Online (Sandbox Code Playgroud)
替代方案:
if ( x != 0 ){
a = y;
}else{
a = z;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用来自https://github.com/contiki-os/contiki的源文件我添加了一个新目录(比如/foo
),其中包含一些 .c 和 .h 文件
我需要在 上使用它们examples/cc26xx
,尽管我将 .h 文件(在 下/foo
)包含在cc26xx-demo.c 中,但在我运行时它并没有真正包含这些文件make
谁能告诉我如何将它们包含在examples/cc26xx/Makefile或Makefile.include 中
我在Linux上开发了一个C代码,我想执行一个二进制文件/usr/sbin/binary_program -p xxx
,是否有另一种方法,而不是system()
调用执行二进制文件?