我们知道,嵌入式linux以其独特的魅力霸占了初级嵌入式程序员学习的整个阶段,同时嵌入式linux的开发环境要求我们,在linux上编译,在windows上下载调试,这不能不说是一种无奈,面对这样的情形,我们有诸多办法,比如2台机器,分别linux和windows,这样在windows上使用linux编译开发,在windows上下载,不过今天我给大家展现一种舒服高效的嵌入式linux开发环境,不是什么创新,而是已有技术的结合。
虚拟机大家都用过,嵌入式linux开发的时候,大家一定用过,那么有没有感觉到,来会切换很烦人,很费时呢?跟我来:
1.安装vmware虚拟机,这里推荐6.0.2 Build59824汉化版,测试使用非常的稳定ps:怎么安装就不说了
2.vmware安装Fedora11_YlmF_V1.0,此版本也很不错,稳定,已经中文化好了,测试使用非常的稳定,怎么安装就不说了
3.这里到了最关键的部分,切换到虚拟机的时候,我们选择快速切换,此时虚拟机是全屏幕的,注意调整下分辨率,和windows桌面一样大,并且调整好桌面背景,看起来是同一个桌面一样。
下面我们要实现虚拟机桌面和windows桌面的前换的一键完成,暂定F4键
4.我们在windows上建立如下程序,并添加到自启动,看的出来,是一个后台运行的微型web服务,代码如下:
//minServer.c
/***
* No Copyright
* Author : linucos
*
*******************************************************************************/
#include <Winsock.h>
#include <stdio.h>
#pragma comment (linker, "/ENTRY:mainCRTStartup")
#pragma comment (linker, "/subsystem:windows")
#pragma comment(lib, "ws2_32.lib")
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen;
char buffer[10] = "/0";
HWND hWnd;
int main(void)
{
SOCKET servSock;
WSADATA wsaData;
int iErrorCode;
if (WSAStartup(MAKEWORD(2,1), &wsaData))
{
printf("Winsock initial failure....../n");
WSACleanup();
return 0;
}
printf("server startup......./n");
fromlen = sizeof(from);
local.sin_family = AF_INET;
local.sin_port = htons(8989);
local.sin_addr.s_addr = INADDR_ANY;
servSock = socket(AF_INET, SOCK_DGRAM, 0);
bind(servSock, (struct sockaddr*)&local, sizeof(local));
while (1)
{
if (recvfrom(servSock, buffer, sizeof(buffer), 0, (struct sockaddr*)&from,&fromlen))
{
if (buffer[0] == 'm')
{
//找到vmware程序ui,并发送最小化消息
hWnd = FindWindow("VMUIFrame", NULL);
SendMessage(hWnd, WM_SYSCOMMAND, (WPARAM)SC_MINIMIZE, NULL);
}
sendto(servSock, buffer,sizeof(buffer), 0, (struct sockaddr*)&from, fromlen);
}
}
closesocket(servSock);
return 0;
}
意思是,当我们收到m消息时,最小化虚拟机,这样就不用我们在虚拟机里边,找最小化窗口了,或者跳出虚拟机的快捷键。
此时,可以测试一下,运行程序,vmware是否最小化;
5.在fedora下,建立程序如下,
root 11:15:40
//minClient.c
/***
* No Copyright
* Author : linucos
*
*****************************************************************************/
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
struct sockaddr_in server_addr;
int socketId;
int size;
int main(void)
{
socketId = socket(AF_INET, SOCK_DGRAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8989);
//这个地方的ip地址,你要知道windows的ip哦,ipconfig看下就好
server_addr.sin_addr.s_addr = inet_addr("192.168.1.9");
size = sizeof(struct sockaddr);
if (connect(socketId, (struct sockaddr*)&server_addr, size) < 0)
{
printf("connect failure....../n");
return 0;
}
send(socketId, "mm", 3, 0);
printf("minClient : Done....../n");
return 0;
}
意思是给window发消息mm,让他最小化vmware,哈哈~
6.在fedora中,自定义快捷键,指向刚刚建立的minClient,快捷键定为F4哦~
下载可以F4下看看了~是不是退出虚拟机了呢?~
7.现在可以实现一键切换到windows,但是要是也F4切换回linux那就很爽了,下面就行这样的工作,既然能给vmware发最小化消息,当然也能发最大化消息了,程序如下:
//forServer.c
/***
* No Copyright
* Author : linucos
*
***********************************************************************************/
#include <Winsock.h>
#include <stdio.h>
int main(void)
{
HANDLE hWnd = FindWindow("VMUIFrame", NULL);
SendMessage(hWnd, WM_SYSCOMMAND, (WPARAM)SC_MAXIMIZE, NULL);
return 0;
}
ok,工作全部完毕,为此程序建立一个快捷方式,快捷键指定为F4哦,呵呵~注意要把快捷方式拖到开始菜单中~
F4看看,是不是切到linux,再F4,是不是又回来了~
大功告成~~~