VirtualBox already exists in the media registry解决方案

想复制一个虚拟机镜像,再导入使用,出现了以下问题:

Cannot register the hard disk 'c.vdi' with UUID {xxxx} because a hard disk 'c.vdi' with UUID {xxx} already exists in the media registry ('C:/Documents and Settings/xxx/.VirtualBox/VirtualBox.xml').

解决方法是重设UUID,这个和VMware不同,方法如下:

D:\Program Files\PowerCmd>"D:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands sethduuid "d:\xp.vdi"
UUID changed to: a290d94b-19b8-4cbf-9cda-00084c246d15

也可以直接使用clonehd直接得到UUID不同的两个镜像,方法类似,如VBoxManage clonehd "a.vdi' "b.vdi" 

搞定!

还有一个用于压缩VDI文件的命令:

VBoxManage modifyvdi "C:\xxx.vdi" compact

Read More →

嵌入式系统VxWorks介绍及编程

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。 

实时操作系统和分时操作系统的区别

从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。这样的系统无法实时响应外部异步事件。(jm注:windows并不是分时操作系统,网上说的不正确

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。分时系统主要应用于科学计算和一般实时性要求不高的场合。实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。

VxWorks的特点

  • 可靠性

操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。而稳定、可靠一直是VxWorks的一个突出优点。自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

  • 实时性

实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。

  • 可裁减性

用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。

VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks 内核最小为 8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。

对一个实时内核的要求

一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:

多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。系统内核分配CPU给这些任务来获得并发性。

抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。

任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。

任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。所以需要在任务级和中断级之间存在通信。 

 

Read More →

Android环境搭建笔记

参考:http://android.yaohuiji.com/archives/5

JDK和Eclipse去官网下载即可。

ADT(Android Development Tools)的安装:

ADT是Eclipse的插件,是用Eclipse进行Android开发的开发工具,它本身不是Android SDK。安装方法和同其他Eclipse插件的方法一样(Help-> Install New Software…)。ADT安装成功后eclipse工具栏中会出现小机器人图标。

这里说得比较粗,添加软件的源不是Eclipse自带的,源地址是:https://dl-ssl.google.com/android/eclipse/,具体参考这里:http://blog.chinaunix.net/uid-12845622-id-311979.html

 

Read More →

The keywords of JAVA

Java具有一组内置的关键字,这些关键字绝对不能用来做为标识符。Java  SE6里一共有50个关键字(keywords):

abstract, continue, for, new, switch assert, default, goto, package, synchronized boolean, do, if, private, this break, double, implements, protected, throw byte, else, import, public, throws case, enum, instanceof, return, transient catch, extentds, int, short, try char, final, interface, static, void class, finally, long, strictfp, volatile const, float, native, super, while

这些单词有共同的特点是:全是小写的,不能用作标识符。(如果非要用做标识符呢,会有什么事情发生?自己去试试看)。其中 instanceof 是 instance of 的连写 ,strictfp 是 strict float point 的连写

有三个看起来像是关键字,其实不是关键的东东,他们是字面值(literal)。

  • true 布尔字面值
  • false 布尔字面值
  • null 空值字面值

Read More →

C语言中的main函数参数及返回值

开发中遇到了需要传参数给main函数的问题,不常用,也就不记得了,特意查了一下,参考这里

一个简单的C语言例子,如下(例子来源于参考网站):

int main(int argc, char *argv[])
{
   int i;
   for (i = 1; i < argc; i++)
       printf("%s%s", argv[i], (i < argc-1) ? " " : "");
   printf("\n");
   return 0;
}

程序编译后,添加参加如:c:\demo.exe hello,world

程序就会运行出来结果:

hello,world

C语言约定:argv[0]的值是启动该程序的程序名,因此argc的值至少为1,如果argc的值是1,说明程序名后面没有命令行参数。

Read More →

BAT脚本获取批处理文件所在路径

参考:http://www.cnblogs.com/lm002003/archive/2012/05/15/2502365.html

BAT命令经常使用,有必要记住几个常命令,命令大全参考:http://blog.csdn.net/annhf/article/details/1842362

这里是MARK一个获取路径的小知识,开发时遇到一个小问题,获取可执行文件的当前路径,这样文件不论转移到哪儿,都可以运行,“write once, run anywhere!”的精髓啊。

在批处理开头加入cd /d %~dp0就可实现当前目录切换,%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径。例如,你的bat文件在e:/mybat/test.bat,则%0就是e:/mybat/test.bat, %~dp0是e:/mybat/,例子来源参考网站。

更多有用的命令:

  • %~0: 取文件名(名+扩展名) 
  • %~f0:取全路径 
  • %~d0:取驱动器名 
  • %~p0:只取路径(不包驱动器) 
  • %~n0:只取文件名 
  • %~x0:只取文件扩展名 
  • %~s0:取缩写全路径名 
  • %~a0:取文件属性 
  • %~t0:取文件创建时间 
  • %~z0:取文件大小 

Read More →

关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突

参考:http://www.cnblogs.com/lin1270/archive/2013/04/17/3025831.html

多线程调试直接崩溃,没有堆栈调用,很难查问题,只有一个错误提示框,类似于“关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突”,参考上述站点,把堆栈调出来的方法,MARK:

工具栏上的【调试】->【异常】,把图上显示的【引发】勾上即可。

Read More →

数组名和数组名取地址的区别

一直困惑了很久的一个问题,今天终于解决了,参考:http://blog.csdn.net/daniel_ice/article/details/6857019

#include <stdio.h>

int a[2] = {1,2};
int main(){
        printf("a = %p\n", a); // I
        printf("&a = %p\n", &a); // II
        printf("a + 1 = %p\n", a + 1);// III
        printf("&a + 1 = %p\n", &a + 1);// IV

        return 0;
}
//结果如下(Windows):
//a = 01137034
//&a = 01137034
//a + 1 = 01137038
//&a + 1 = 0113703C

在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。

看到这里我想应该就知道为什么 会有I 和 III式的结果了。

对于II 和 IV 则是特殊情况,在《C和指针》p142中说到,在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。

所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。

Read More →

字符串常量到底存放在哪个存储区

参见搜索做的总结,原文地址如下:http://blog.csdn.net/daiyutage/article/details/8605580

一直有一个疑惑,字符串常量放在哪个存储区呢?比如:

char *pstr = "hello world!";

这里,"hello world!"是一个字符串常量,pstr是在栈中的变量,字符串常量(hello world!),如何存储?举个例子,比较清晰。

//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。
    static int c = 0; //全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    //分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

上面例子说得比较全了,之前还以为char s[] = "abc"; 这里的abc也是在常量区,too young, too simple啊。

下面总结的一些常识,很形象,很生动,MARK一下。

Read More →

逗号表达式

逗号表达式,不常用,安全软件编码中也不允许使用,百科的解释比较到位:

c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。(a=3*5,a*4)的值是60。

看两个例子就能明白,这两个例子都是告诉我们,逗号运算符的优化级比赋值号还低。

main()
{
    int a, b, c, d;        
    a = 3;
    b = 5;
    c = a, b;
    d = (a, b);
    printf(" c = % d & quot; , c);
    printf(" d = % d & quot; , d);
}
//结果是 3 5

 

main()
{
    int x, y, z;
    x = y = 1;
    z = x++, y++, ++y;
    printf("%d,%d,%d\n", x, y, z);
}
//结果是 2 3 1 

Read More →
在线学习答案查询入口
微信扫码联系
微信扫码联系