1、BeagleBoardQNX1实验1在VMWare QNX虚拟机上面运行简单的互斥量例子1.1实验环境:IDE:QNX Momentics 6.5目标机:VMware虚拟机软件+x86平台QNX虚拟机1.2目标板环境建立由于我们使用qnx公司提供的虚拟机设备进行实验,所以过程非常简单,只需要把虚拟机使用VMware打开就可以了。A. 路径:虚拟机的目录在“实验beagleboard_qnxNeutrino650Target”下面B. 打开:您可以使用VMware直接打开C. 启动:默认启动就可以。默认的的是带Photon的桌面环境。D. 登录:用户名为root。没有设置密码。当然可以使用pas
2、swd命令给用户添加密码。如图所示,登陆界面如图所示Photon 环境:1.3 IDE安装Momentics 6.5它是基于Eclipse开发的为QNX项目提供帮助的IDE。上面集成了像C plugin等一些列支持QNX开发的插件。特点:使用非常地方便,无论是在编辑、编译还是在调试的时候。安装Windows下面的安装过程是很简单。A.安装程序路径: “实验beagleboard_qnxqnxsdp-6.5.0-201007091524-win32.exe”B.运行:双击运行。(注意事项:因为是基于Eclipse的,那么,需要在主机上运行有相应的Java环境。)C.安装过程:“下一步”就可以解决
3、问题。一般会把安装好的默认路径设C:QNX650D.激活:激活码如下图所示,这是个人申请的非商用激活码,仅供实验使用。如果需要开发商业软件,请到QNX官网:申请。1.4 建立工程完成安装方面的工作,我们在IDE中开发相应的x86程序。A. 新建:点击“File-New-QNX C Project”选择QNX C工程,然后“下一步”。B. 工程名:输入相应的工程名称,点击“下一步”。C. 体系结构:在Build Variants当中选择x86体系。QNX 相应的工具链已经在IDE中。点击“Finish”。1.5 编辑/编译A.编辑:在编辑区域中,修改代码(本节末附)B.编译:右击你的工程目录,选
4、择“Build Make Target”,直接编译运行。1.6 主机和虚拟机连接A打开目标板的连接:在x86虚拟机上面输入命令qconnB. 查看目标板的IP:输入命令ifconfig查看,实例是192.168.23.147C. 建立连接工程:点击“File-Other-QNX Target System Project”,然后“下一步”。D. 在“Hostname or IP”中填入目标机的IP地址。点击“Finish”完成。E. 主机和目标机连接:将主机网卡激活(一般方式将插上网线,指示灯亮)。将主机IP设置成和目标板IP在一个网段。这里介绍Windows 7下的设置方式。在桌面点击“Wi
5、ndows 图标控制面板-网络和共享中心”,找到“本地连接”,点击打开。进入“本地连接”后,选择“属性-Internet 协议版本”将IP地址改为如图所示,这里IP要和目标板在同一个网段,因此设置成“192.168.23.xxx”(xxx代表可选)。子网掩码一般都是“255.255.255.0”。默认网关是“192.168.23.1”(最后一位是1)。点击“确定”返回。F. 在主机运行”cmd”打开终端。运行“ipconfig”查看当前主机的IP,检查是否分配到IP。使用“ping 目标板IP”命令查看两台机器是否相连。G. 如果没有“ping”成功修改QNX虚拟机设置。网络连接方式改为“Br
6、idge”(桥接)。1.7 调试A. 返回到IDE,在视图中选择目标板系统,图中最右边的那一个B. 这时候在左下角的地方可以看见一个列表。这个列表列出了现在目标板上面运行的进程。可以双击查看。C. 回到“C/C+ perspective”这个视图中选中同步互斥量工程,点击“debug”的小虫子下拉菜单,选中“Debug Configuration”。D. 选择“C/C+ QNX Qconn(IP)”,点击“New”。E. 右边出现你现在的工程。在“C/C+ Application”中点击“Search Project”找到你需要调试的程序。一般选择_g的因为在编译的时候使用了-g命令,有相关的
7、调试信息在其中。F. 选择好目标板G. 点击“Apply”应用,然后点击“Debug”。自动进入到“Debug”视图。点击运行的绿色箭头可以运行程序。在下方的控制台可以查看打印信息。H. 调试技巧:调试包括设置断点、单步跟踪等等,也有相应的快捷键。这里不再赘述。1.8 附录(互斥量示例程序)#include #include #include #include #include void bushchanger_nomutex();void kerrychanger_nomutex();void bushchanger_mutex();void kerrychanger_mutex();cha
8、r *firstname;char *lastname;pthread_mutex_t presidentmutex;int main(int argc, char *argv) int i; pthread_t t1,t2; firstname=malloc(32); lastname=malloc(32); printf(The president mixern); printf(Demonstrating the usage of mutexesn); printf(nStarting threads WITHOUT mutex usage!n); pthread_create(&t1,
9、 NULL,(void*) &bushchanger_nomutex, NULL); pthread_create(&t2, NULL,(void*) &kerrychanger_nomutex, NULL); for (i=0; i40; i+) delay(500); printf(%s %s for president!n,firstname,lastname); pthread_detach(t1); / dont care about return pthread_detach(t2); / values of threads 1 & 2 pthread_abort(t1); / k
10、ill thread 1 pthread_abort(t2); / kill thread 2 printf(nNow invoking functions WITH mutex usage!n); pthread_mutex_init(&presidentmutex, NULL); pthread_create(&t1, NULL,(void*) &bushchanger_mutex, NULL); pthread_create(&t2, NULL,(void*) &kerrychanger_mutex, NULL); for (i=0; i40; i+) delay(500); pthre
11、ad_mutex_lock(&presidentmutex); printf(%s %s for president!n,firstname,lastname); pthread_mutex_unlock(&presidentmutex); return EXIT_SUCCESS;void bushchanger_nomutex() while (1) strcpy(firstname, George); delay(55); strcpy(lastname, Bush); delay(55); void kerrychanger_nomutex() while (1) strcpy(firs
12、tname, John); delay(77); strcpy(lastname, Kerry); delay(77); void bushchanger_mutex() while (1) pthread_mutex_lock(&presidentmutex); strcpy(firstname, George); delay(55); / delay to make the problem more visible strcpy(lastname, Bush); pthread_mutex_unlock(&presidentmutex); delay(55); void kerrychanger_mutex() while (1) pthread_mutex_lock(&presidentmutex); strcpy(firstname, John); delay(77); / delay to make the problem more visible strcpy(lastname, Kerry); pthread_mutex_unlock(&presidentmutex); delay(77);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1