5 MC9S12C语言与标准C语言区别
MC9S12的C语言与标准C语言的区别;1、建立汇编语言工程;建立汇编语言工程;;2、建立C语言工程;建立C语言工程;建立C语言工程;C语言程序结构;3、Codewarrior 4.6 程序调试;Codewarrior 4.6 程序调试;Lecture5 Page *;4、S格式文件;S格式文件; S0510000433A5C446F63756D656E747320616E642053657474696E67735C41646D696E6973747261746F725C4D7920446F63756D656E74735C50726F6A6563745F335C62696E5C50726F6A6563742E616273BD S123C000CF050010EF180BFF0003180B550001CE00017E0500070E7C0502FE0500088E0028 S119C0201826EF20EACD0000CC000104050719EEB7C60435F93D32 S105FFFEC0003D S9030000FC;2、MC9S12的C编程与标准C的不同;;2.1 变量;自定义CodeWarrior数据类型 ;16位微控制器内部的数据长度是16位(2字节),所以首选的数据类型是“int”。16位机处理16位数据比8位数据的效率更高。 对于9S12单片机来说,16位数据类型效率最高,因此在使用中,尽量选择int类型数据。若可能,选用无符号类型。;存储类修饰符;可变(volatile)变量 ;例子;程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。?;Lecture5 Page *;volatile用在如下的几个地方;const;Const volatile 变量 ;最明显的例子是硬件状态寄存器,像SCI状态寄存器SCS1。这个寄存器包含信号状态标志,如发送空、发送完成、接收满以及其它。
这是一个可变寄存器由于这些标志的改变依赖于串行通信的状态;这也是只读,由于标志不能被程序直接改写,它们只对模块的状态作出响应。这个状态寄存器最佳声明方法是:const volatile unsigned char SCS1 @0x0016 ;2.2 资源的映射;访问固定内存位置;访问固定内存位置;访问I/O寄存器 ;另一种方法是在变量声明中使用符号“@”:
const volatile unsigned char SCS1 @0x0016 ;2.3 C语言的中断;9S12中断源有55个,中断向量号越小,优先级越大。见课本64页。在codewarrior环境下,中断向量号在头文件中,例如mc9s12dg28.h;2.4 标准C库;标准C语言与硬件无关,I/O的输入输出并不是标准C语言的一部分。在标准C语言中,I/O操作是通过操作系统实现的。在标准C中, printf()缺省的控制台是显示器,但9S12没有显示器作为片外外设。在嵌入式编程中,如果需要使用这个功能,则需要修改基础库函数才能正确输出。 凡是需要显示在显示终端的,可以使用SCI(异步串行通信)发送到PC机的超级终端显示。;2.5 C语言入口;void _Startup() { asm { LDS 0x1000 JSR HardInit JSR main } };2.6 程序的链接与定位 ;邢镶抒栓曾球碧抛砂遂象舆控狮遵眨导嫂认足指胸寡精纠优球砾全姬操储5 MC9S12C语言与标准C语言区别5 MC9S12C语言与标准C语言区别;C语言与汇编语言的混合编程 ;C中使用汇编 ;例1 ;谢谢!