我使用嵌入式(C)编写了一个使用8051微控制器的腕表程序.总共有6个7段显示器:
_______________________
| | | | two 7-segments for showing HOURS
| HR | MIN | SEC | two 7-segments for showing MINUTES and
|______._______.________| two 7-segments for showing SECONDS
7-segment LED display
Run Code Online (Sandbox Code Playgroud)
为了更新小时,分钟和秒,我们使用了3个for
循环.这意味着首先会更新秒数,然后是分钟数,然后是小时数.然后我问我的教授为什么我们不能同时更新(我的意思是一小时后增加小时数而不等待更新的会议记录).他告诉我,由于顺序执行指令,我们无法进行并行处理.
题:
一张数字生日贺卡,可同时连续播放音乐,同时闪烁LED.数字闹钟会在特定时间发出哔哔声.虽然它正在产生声音,但时间将继续更新.所以声音和时间增量都是并行运行的.他们是如何通过顺序执行实现这些结果的?
如何在微控制器中同时运行多个任务(调度)?
我有一个程序.
#include <stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序正常工作并输出如下:
12
f(1, 2)
Run Code Online (Sandbox Code Playgroud)
我不明白编译器如何给出这个输出.
#in a##b
和#a
?的功能是什么?
我有2个线程(thread1和thread2).我有信号处理SIGINT
.每当SIGINT
发生线程2应该处理信号时.为此,我写了下面的程序
void sig_hand(int no) //signal handler
{
printf("handler executing...\n");
getchar();
}
void* thread1(void *arg1) //thread1
{
while(1) {
printf("thread1 active\n");
sleep(1);
}
}
void * thread2(void * arg2) //thread2
{
signal(2, sig_hand);
while(1) {
printf("thread2 active\n");
sleep(3);
}
}
int main()
{
pthread_t t1;
pthread_t t1;
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
while(1);
}
Run Code Online (Sandbox Code Playgroud)
我编译并运行该程序.每1秒"thread1 active"正在打印,并且每3秒"thread2 active"正在打印.
现在我生成了SIGINT
.但它上面打印"thread1 active"和"thread2 active"消息.我再次生成SIGINT
,现在每3秒只有"thread2 active"消息正在打印.我再次生成SIGINT
,现在所有线程都被阻止了.
所以我理解,第一次主线程执行信号处理程序.第二次thread1执行处理程序,最后thread2执行信号处理程序.
我怎样才能编写代码,就像信号发生时一样,只有thread2必须执行我的信号处理程序?
我正在阅读如何将可选参数传递给函数.但我无法理解这些.当我看到例子时,它们令人困惑,有点复杂.所以我刚开始用一个非常简单的程序来完成我迄今所理解的内容.
下面的程序只打印变量.
void print(int x, ...)
{
va_list ap;
int i = 4; // I know I'm passing only 4 opt variables.
int num;
va_start(ap, x);
while(i--) { // How to know how many variables came in real time?
num = va_arg(ap, int);
printf("%d\n", num);
}
va_end(ap);
return;
}
int main()
{
print(1,2,3,4,5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不知道上面的程序是对还是不对.但它正在发挥作用.当我将i
值更改为5
打印垃圾时.如何知道有多少论点得到了(像argc
中main
)?
我最近尝试过这段代码并且有点困惑.请参阅以下声明:
static st;
auto au;
register reg;
volatile vl;
const cn;
Run Code Online (Sandbox Code Playgroud)
它们都分配4个字节的内存(在32位GCC上).但是当我尝试打印(使用printf
功能)他们的尺寸时,他们没有工作并且出错.
sizeof(const) // worked and printed 4
sizeof(volatile) // worked and printed 4
sizeof(auto) // error: expected expression before ‘auto’
sizeof(static) // error: expected expression before ‘static’
sizeof(register) // error: expected expression before ‘register’
Run Code Online (Sandbox Code Playgroud)
我怀疑是auto, static, register
关键字还分配4字节的内存(在32位拱门上).
但是,为什么这些是给错误不像const
和volatile
?
我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0
).我为该块设备注册了所有设备操作:(参见include/linux/blkdev.h
2.6.32内核源代码)
static struct block_device_operations sbd_ops = {
.owner = THIS_MODULE,
.open = sbd_open,
.release = sbd_close,
.ioctl = sbd_ioctl,
.getgeo = sbd_getgeo,
.locked_ioctl = sbd_locked_ioctl,
.compat_ioctl = sbd_compat_ioctl,
.direct_access = sbd_direct_access,
.media_changed = sbd_media_changed,
.revalidate_disk = sbd_revalidate_disk
};
Run Code Online (Sandbox Code Playgroud)
我编译了驱动程序.我插入了模块并/dev/sbd0
创建了.现在我想测试我的驱动程序代码.所以我写了一个如下的应用程序.
fd = open("/dev/sbd0", O_RDONLY);
retval = ioctl(fd, BLKBSZGET, &blksz); //trying to get logical block size
Run Code Online (Sandbox Code Playgroud)
输出是:4096
我想知道:我没有实现ioctl BLKBSZGET
.它没有调用我sbd_ioctl
,而是使用了默认驱动程序并给了我结果.因为open
,close
调用它执行sbd_open
和sbd_close
(我实现).然后我尝试了:
retval = ioctl(fd, HDIO_GETGEO, &geoinfo); …
Run Code Online (Sandbox Code Playgroud) 程序连接到服务器,当服务器关闭连接时,如果我尝试重新连接它说:socket.error: [Errno 9] Bad file descriptor
如果我在客户端关闭套接字然后我尝试重新连接,它说:socket.error: [Errno 106] Transport endpoint is already connected
.
有没有办法在管道损坏后重新连接而不创建新套接字?
import socket
host = '127.0.0.1'
port = 1337
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def loop():
try:
while 1:
print s.recv(512)
except socket.error:
#s.close()?
connect()
def connect():
s.connect((host, port))
loop()
connect()
Run Code Online (Sandbox Code Playgroud) 最近我在编写文件打开程序时遇到了一个问题.
让我清楚地解释一下我的问题.我在这里以open
电话为例.
要创建文件:
open("file_name", O_CREAT, 0766); //passing 3 parametrs
Run Code Online (Sandbox Code Playgroud)
要打开文件:
open("file_name", O_RDWR); //only 2 arguments.
Run Code Online (Sandbox Code Playgroud)
然后我清楚地看到了这一点,它也适用main()
.
main(void) //worked
main(int argc, char **argv); //worked
main(int argc) //worked and it's doesn't give an error like "too few arguments".
main() //worked
Run Code Online (Sandbox Code Playgroud)
那么我们如何创建这些可选参数呢?编译器如何验证这些原型?如果可能,请编写示例程序.
这个波纹管代码将在最后一行生成Aborted(core dumped).
码:
#include <stdio.h>
#include <malloc.h>
int main()
{
char *ptr;
ptr=malloc(sizeof(char)*10);
free(ptr);
free(ptr); // core dumped
}
Run Code Online (Sandbox Code Playgroud)
输出是:
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x091f7008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7665ee2]
./a.out[0x804846d]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb76094d3]
./a.out[0x8048371]
======= Memory map: ========
08048000-08049000 r-xp 00000000 fc:00 4070236 /home/gangadhar/a.out
08049000-0804a000 r--p 00000000 fc:00 4070236 /home/gangadhar/a.out
0804a000-0804b000 rw-p 00001000 fc:00 4070236 /home/gangadhar/a.out
091f7000-09218000 rw-p 00000000 00:00 0 [heap]
b75ba000-b75d6000 r-xp 00000000 fc:00 22938319 /lib/i386-linux-gnu/libgcc_s.so.1
b75d6000-b75d7000 r--p 0001b000 fc:00 22938319 /lib/i386-linux-gnu/libgcc_s.so.1
b75d7000-b75d8000 …
Run Code Online (Sandbox Code Playgroud) 我有3个阵列l1[,,,,], l2[,,,,] and l3[,,,,]
.每个都有5个字符.
e.g. l1["A","B","C","D","E"]
Run Code Online (Sandbox Code Playgroud)
2d阵列由这些组成
screen = [l1[],l2[],l3[]]
Run Code Online (Sandbox Code Playgroud)
所以它看起来如此:
screen = [[,,,,],[,,,,],[,,,,]]
Run Code Online (Sandbox Code Playgroud)
我怎么能遍历这个数组?
我打电话screen[5]
吗?还是screen[l1[5]]
?
我可以吗:
for (i in 1..15){
println screen[i]
}
Run Code Online (Sandbox Code Playgroud)
请帮忙!!!
如何迭代数组并调用不同的部分,例如1st element
每个子数组?
谢谢