小编gan*_*ars的帖子

如何在微控制器中实现多任务处理?

我使用嵌入式(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.数字闹钟会在特定时间发出哔哔声.虽然它正在产生声音,但时间将继续更新.所以声音和时间增量都是并行运行的.他们是如何通过顺序执行实现这些结果的?

如何在微控制器中同时运行多个任务(调度)?

c embedded parallel-processing concurrency

14
推荐指数
4
解决办法
9056
查看次数

'#'在C中究竟做了什么?

我有一个程序.

#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?的功能是什么?

c c-preprocessor

11
推荐指数
2
解决办法
757
查看次数

哪个线程处理信号?

我有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必须执行我的信号处理程序?

c linux multithreading signals pthreads

11
推荐指数
2
解决办法
1万
查看次数

如何知道va_list的最后一个参数?

我正在阅读如何将可选参数传递给函数.但我无法理解这些.当我看到例子时,它们令人困惑,有点复杂.所以我刚开始用一个非常简单的程序来完成我迄今所理解的内容.

下面的程序只打印变量.

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打印垃圾时.如何知道有多少论点得到了(像argcmain)?

c variadic-functions optional-parameters

8
推荐指数
2
解决办法
3609
查看次数

混淆'sizeof'运算符的结果

我最近尝试过这段代码并且有点困惑.请参阅以下声明:

 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位拱门上).

但是,为什么这些是给错误不像constvolatile

c gcc declaration sizeof

7
推荐指数
2
解决办法
763
查看次数

为什么内核使用默认的块驱动程序而不是我的驱动程序代码?

我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(参见include/linux/blkdev.h2.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_opensbd_close(我实现).然后我尝试了:

retval = ioctl(fd, HDIO_GETGEO, &geoinfo); …
Run Code Online (Sandbox Code Playgroud)

linux kernel block-device

7
推荐指数
1
解决办法
569
查看次数

管道损坏后如何重新连接插座?

程序连接到服务器,当服务器关闭连接时,如果我尝试重新连接它说: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)

python sockets

6
推荐指数
1
解决办法
1万
查看次数

如何在C中使用可选参数创建函数?

最近我在编写文件打开程序时遇到了一个问题.

让我清楚地解释一下我的问题.我在这里以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)

那么我们如何创建这些可选参数呢?编译器如何验证这些原型?如果可能,请编写示例程序.

c gcc gnu function

6
推荐指数
1
解决办法
2万
查看次数

需要有关Aborted(core dumped)的更多信息

这个波纹管代码将在最后一行生成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)

c malloc coredump runtime-error backtrace

6
推荐指数
1
解决办法
4万
查看次数

Groovy 2d数组

我有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每个子数组?

谢谢

groovy multidimensional-array

5
推荐指数
1
解决办法
2万
查看次数