【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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) 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%就可以了。
1
时间: 2024-10-23 02:31:35