DIY编程器网

标题: FrankLin For Windows 使用经验谈 [打印本页]

作者: liyf    时间: 2014-10-4 22:30
标题: FrankLin For Windows 使用经验谈
FrankLin For Windows 使用经验谈

1、FrankLin For Windows 是单文件编译,可以不必象DOS下要等全部文件编好后才能编译;所以每个程序文件都必须有完整的引用说明,不是本文件的函数都必须用extern 进行原型说明。

2、数据定义要求更严格。V6 编译器严格要求程序按照ANSI的规范。原先在老版本编译通过的不规范声明在V6中将不能通过编译。严格规范变量的分配,使得unsigned char 和 char 声明的变量不能直接相互赋值。在存储空间的分配上,虽然 unsigned char data 和 data unsigned char现在都能通过,但在后继版本中可能不在支持。
    下面的语句在V6中不能通过编译:
    char data *msg = "mcu";    // 错误
    ANSI规范认为这种赋值是一种浪费,这从代码空间拷贝字串到数据空间一个字串占用了两个空间。实际上这在狭窄空间的8051体系中却不是好的作法。但你绝对要这样做,也可如此:
    char data *msg = (char data *)"mcu";   
最好的方法是:char *msg = "mcu";  指针msg将指向代码区。   
对于8051体系也可这样:char code *msg = "mcu";   但这样会降低代码可移植性。  
    还有一个语法新变化让人费解。
    xdata char *x;   
    if( *x != 0xF0 ) {....}
这在V6是错误的!按照ANSI规范0xF0 可能被转换成有符号整数(signed int)!正确的作法是:if( *x != (char )0xF0 ) {....}



3、利用功能强大的虚拟仿真可不必为程序的许多逻辑错误的排除费时费力了,仅需在鼠标点击中便查出总是所在。在虚拟仿真状态下,可以监测串口输入输出、查看寄存器值,RAM区数据,设置I/O口的状态,定时器,中断等。

4、IDE界面,在窗口下可完成全部任务。在DOS下代码编写,编译,连接,查错,调试在不同的DOS程序完成,很不方便。在语法查错时在DOS就很吃力,WINDOWS版只要点击出错提示便自动跳到代码出错处。

5、在线帮助;在WINDOWS版你不必为个语法、一个函数的用法而到处翻资料苦恼了。在DOS下有时为查一个函数的确切参数用法费尽心机,有时到TURBO C的在线帮助去找,而TURBO C的在线帮助也很差。在WINDOWS版的在线帮助不仅有详细语法说明而且还提供不少示例,大部份编程问题都可从在线帮助找到答案,只是它是英文。

6、生成的代码更短;通过HEX文件大小可发现,WINDOWS版要比DOS版小了许多。

7、函数申明;一些不规范函数申明将不能通过编译,如 display(),应为void display(void)主函数也不例外,以前常用的main(){...}也必须改为void main(void)。

8、V6支持C++的“//”注释,只是V6不支持中文注释。

9、在TOOL菜单选GREP可在当前目录下查找所有某类文件中的字符串。

10、与DOS版相比,WINDOWS版更加函数化;在DOS版中外部函数的引用更多地靠引用整个文件,虽然也可用extern关键字,但DOS版支持和规范都不够。程序员常常把功能相近的函数放到一个C文件中,出于修改、查看等缘故,这个C文件不做成库文件,这就造成一些没有使用的函数也被编译连接到最后的OBJ文件,白白占用宝贝单片机存储资源。WINDOWS版支持单文件编译,没有使用的函数不被连接了,所以从这个角度WINDOWS版目标代码更短小。

11、WINDOWS版的数据存储分配要比DOS好;在DOS 分配不了的在WINDOWS版却能通过。

12、WINDOWS V6版仍然没有很好解决堆栈分配问题;如果在中断例程中再调用函数,编译连接都通过,但往往单片机工作时却得不正确的结果。实际上函数中再调用函数,很容易造成堆栈溢出,而在编译连接时却发现不错误。

13、WINDOWS V6版中对于位和其它类型数据的操作提出警告;在如:         char c;
        bit m;
        c=c & m;
既然现在发警告还能通过的话,在将来的版本估计就会出错了!不让这样做,有它的道理。可用下面的代码替换之 :
         char c;
         bit  m;
         if(m)
         {
             c=c & (char)0xff;
         }
         else
         {
              c=c & (char)0xfe;
          }
不知还有没别的好办法,感觉没以前省事且效率差多了,这点让人对ANSI有点说法了,希望以后的版本还继续支持位与其它数据直接操作,让我们这些程序员少操点心。




欢迎光临 DIY编程器网 (http://www.diybcq.com/) Powered by Discuz! X3.2