首页 > 代码库 > 随想录(在x86 linux上仿真多核cpu运行)

随想录(在x86 linux上仿真多核cpu运行)


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    搞过嵌入式开发的朋友都知道无论在实际环境还是在fpga上调试代码是一件非常辛苦,同时吃力不讨好的事情。一方面芯片的片上资源少,另外一方面就是除了软件之外你还要处理各种意外的硬件事故。好一点的公司可能还会提供虚拟机来调试,但很多时候虚拟机的稳定性也是一个问题。搞过skyeye的朋友应该比较有体会。


    其实,如果调试驱动代码或者cpu boot代码,那么毫无疑问应该在实际环境上开发。但是如果开发的代码只是c的内容,其实在x86上仿真就可以了。x86的调试环境极其稳定,而且支持的功能也很多,另外x86对单核、多核的支持也是非常的好,这是很多开发板无法比拟的。


    打个比方,在实际环境上调试多核是一件很累的事情。但是在x86上,尤其是多核x86上,你只需要起两个thread,分别绑定到不同的cpu就可以了。就是这么简单。下面给出一份简单的linux thread绑定代码。编译的方法是gcc start.c -g -o start -lpthread即可。原来的代码地址在man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html。

#define _GNU_SOURCE#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#define handle_error_en(en, msg)       do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)intmain(int argc, char *argv[]){    int s, j;    cpu_set_t cpuset;    pthread_t thread;    thread = pthread_self();    /* Set affinity mask to include CPUs 0 to 4 */    CPU_ZERO(&cpuset);    for (j = 0; j < 4; j++)        CPU_SET(j, &cpuset);    s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);    if (s != 0)        handle_error_en(s, "pthread_setaffinity_np");    /* Check the actual affinity mask assigned to the thread */    s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);    if (s != 0)        handle_error_en(s, "pthread_getaffinity_np");    printf("Set returned by pthread_getaffinity_np() contained:\n");    for (j = 0; j < CPU_SETSIZE; j++)        if (CPU_ISSET(j, &cpuset))            printf("    CPU %d\n", j);    exit(EXIT_SUCCESS);}

    怎么看有没有绑定成功呢?你可以添加一段while(1); 代码。然后输入top命令,按下1,看看对应的cpu有没有使用率达到100%就可以了。



1

随想录(在x86 linux上仿真多核cpu运行)