随想录(在x86 linux上仿真多核cpu运行)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 搞过嵌入式开发的朋友都知道无论在实际环境还是在fpga上调试代码是一件非常辛苦,同时吃力不讨好的事情。一方面芯片的片上资源少,另外一方面就是除了软件之外你还要处理各种以外的硬件事故。好一点的公司可能还会提供虚拟机来调试,但很多时候虚拟机的稳定性也是一个问题。搞过skyeye的朋友应该比较
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
搞过嵌入式开发的朋友都知道无论在实际环境还是在fpga上调试代码是一件非常辛苦,同时吃力不讨好的事情。一方面芯片的片上资源少,另外一方面就是除了软件之外你还要处理各种意外的硬件事故。好一点的公司可能还会提供虚拟机来调试,但很多时候虚拟机的稳定性也是一个问题。搞过skyeye的朋友应该比较有体会。
其实,如果调试驱动代码或者cpu boot代码,那么毫无疑问应该在实际环境上开发。但是如果开发的代码只是c的内容,其实在x86上仿真就可以了。x86的调试环境极其稳定,而且支持的功能也很多,另外x86对单核、多核的支持也是非常的好,这是很多开发板无法比拟的。
打个比方,在实际环境上调试多核是一件很累的事情。但是在x86上,尤其是多核x86上,你只需要起两个thread,分别绑定到不同的cpu就可以了。就是这么简单。下面给出一份简单的linux thread绑定代码。编译的方法是gcc start.c -g -o start -lpthread即可。原来的代码地址在http://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)
int
main(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%就可以了。
更多推荐
所有评论(0)