winscope编译器代码编写注意事项

声明

请严格要求按照下述注意事项和方法操作,否则可能会导致程序运行混乱及无
法预料的情况发生,若排除以下情况后编译或程序运行仍有异常请及时与我们技术支持
取得联系。

1. 操作特别注意

1.1 C 相关文件命名规则

“.h”、“.c”文件的文件名必须由字母或数字或下划线组成

1.2. 变量定义及代码写法

1.2.1 编译器默认占用前七个寄存器地址,请勿重复定义
1.2.2 局部变量能正常使用,但是目前还不能查看变量的值,建议使用全局变量进行操作,

考虑到编译器的优化问题,建议声明变量时,变量前面加”volatile”修饰符,这样
所有对变量的操作都不会被编译器优化掉.

1.2.3 代码输入,同一行建议不要写多行代码

1.3 特殊寄存器操作

操作 SFR、SFR0、SFR1、INDF、INDF0、INDF1、INDF2、HIBYTE、PCL 等,操作数据指针寄存
器,程序指针计数器,间接寻址寄存器,字操作高字节缓冲器时,需要关闭中断,否则可能
导致程序运行异常。

1.4 乘除法/指针/结构体等操作

编译器对乘数法/指针/结构体支持不友好,程序里尽量不用乘法、除法、指针、结构体等,
可用移位、加法、减法等来代替。

1.5 函数定义及调用

函数带参调用及返回值不能使用单字节以上的参数,请使用单字节(unsigned char,char)
参数传递或用全局变量。

1.6 中断返回

中断函数中不能使用“return”等返回语句。

1.7 通用兼容模式选择

若芯片带通用和兼容模式选择,请务必在编译和烧录时保持选项一致。建议统一使用通用模
式,除非有特殊需求。

2. 部分特殊操作方法

2.1 嵌入汇编代码的方法

嵌入汇编代码需要在函数内部完成;需要注意的是,调用汇编代码使用到寄存器时,
需加“_”前缀,如“_T0CR”,如下调用 ASM 方法:
Void test(void)
{
__asm

MOVAR _T0CR
__endasm;

}

2.2 位定义的方法

位定义的方法参考 C语言位域操作,如下:
Typedef union
{

unsigned char byte;
struct
{

unsigned char bit0 : 1
unsigned char bit1 : 1
unsigned char bit2 : 1
unsigned char bit3 : 1
unsigned char bit4 : 1
unsigned char bit5 : 1
unsigned char bit6 : 1
unsigned char bit7 : 1

}bits;
}Flag;
volatile Flag Flag1;
#define Flag_Timer10Ms Flag1.bits.bit0

2.3 指定地址变量定义方法

指定地址变量定义方法,如下:
指定 ram 地址:

__sfr __at 0x17 a0;

typedef union {
struct {

unsigned char a00:1;
unsigned char a01:1;
unsigned char a02:1;
unsigned char a03:1;
unsigned char a04:1;
unsigned char a05:1;
unsigned char a06:1;
unsigned char a07:1;

};
} __a0bits_t;
volatile __a0bits_t __at 0x17 a0bits;
#define a00 a0bits.a00 /* bit 0 */
#define a01 a0bits.a01 /* bit 1 */
#define a02 a0bits.a02 /* bit 2 */
#define a03 a0bits.a03 /* bit 3 */
#define a04 a0bits.a04 /* bit 4 */
#define a05 a0bits.a05 /* bit 5 */
#define a06 a0bits.a06 /* bit 6 */
#define a07 a0bits.a07 /* bit 7 */

也可以用 volatile unsigned char __at 0x17 a0;方法进行定义

2.4 指定 rom 地址的方法

const unsigned char __at 0x17 a0;

2.5 中断函数定义方法

中断函数定义(需要用户完成压栈、出栈),下面例子是无压栈、出栈指令,利用变量保
存现场;
volatile unsigned char ABuf;
volatile unsigned char StatusBuf;
void int_isr(void) __interrupt
{

__asm
movra _ABuf //__asm …. __endasm 为中断保护现场固定写法,请勿修改。
swapar _STATUS //STATUS为状态字寄存器,根据规格书寄存器描述来写,有些是 PFLAG

movra _StatusBuf
__endasm;
……
code
……
__asm
swapar _StatusBuf//__asm …. __endasm 为中断保护现场固定写法,请勿修改。
movra _STATUS //STATUS为状态字寄存器,根据规格书寄存器描述来写,有些是 PFLAG

swapr _ABuf
swapar _ABuf
__endasm;
}

请将 ABuf、StatusBuf 定义成全局变量;另外,在中断函数中尽量使用不要过多层的调用函
数,以防止堆栈溢出,尽量使用全局变量或者定义的位来操作,不能使用“return”等返回
语句。

2.6 Ram 使用情况查看方法

Ram 使用情况查看已在输出信息框中列出,格式为:
RAM USAGE MAP ('X' = Used, '-' = Unused)
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXX----- ----------------

3. 数据类型描述

Type Size(byte) Scope

char 1 -128 ~ 127

unsigned char 1 0 ~ 255

short 2 -32768~32767

unsigned short 2 0 ~ 65535

int 2 -32768~32767

unsigned int 2 0 ~ 65535

long 4 -2147483648 ~ 2147483647

unsigned long 4 0 ~ 4294967295

long long 4 /

unsigned long long 4 /

float 4 /

double 4 /

long double 4 /

“资料来自中基国威an2002应用笔记“

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值