从一个小程序详解codewarrior for MC68HC908GP32CP C语言指针

本文通过分析一个基于codewarrior的C语言小程序,探讨了byte指针、内存定位以及宏定义在单片机编程中的应用。重点讲解了如何使用byte、指针、宏定义将值存入特定内存单元,并揭示了程序无限循环执行的特性及其与看门狗的关系。
摘要由CSDN通过智能技术生成

#include <hidef.h>
#include <MC68HC908GP32.h>

/* 在codewarrior中建立了C语言的程序之后程序自动引入头文件MC68HC908GP32.h在这个头文件中定义了
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];
如果足够用,建议使用byte而不是int,因为它只占用一个字节,在单片机中内存是稀缺资源,非常宝贵*/

byte a @ 0x0050;         // 定义unsigned char放在50单元,这种定义方式只能用于
                         // 全局变量。

byte *p @ 0x0051;        // 定义一个指针放在0x0051单元,指向一个unsigned char,
                         // 究竟指向什么地址还没有定义。注意!这里非常重要的是,
                         // 虽然byte(unsigned char)只有一个字节,但是这个指针却
                         // 是两个字节的,也就是说在0x0051和0x0052分别存放了这
                         // 个指针的高、低字节。

byte b @ 0x0060;         // 定义一个变量放在60单元

#define c (*(volatile byte*)0x0058)   // 另一种为变量指定地址的方式:宏定义
                                      // 不要为这种复杂的写法感到困惑或者烦躁,
                                      // 它也可以分解成几个很简单的部分来看:
                                      // (volatile byte*)是C语言中的牵制类型转换
                                      // 它的作用是把0x0058这个纯粹的十六进制数
                                      // 转换成为一个地址,其中volatile并不是必要
                                      // 的,它只是告诉编译器,这个值与外环境有关,
                                      // 不要对它优化。这里也没有必要对编译器的具
                                      // 体机制讨论太多[1]。接下来在外面又加了一
                                      // 个*号,就表示取0x0058内存单元中的内容了。
                                      // 经过这个宏定义之后,c就被可以做为一个普通
                                      // 的变量来操作,所有出现c的地方编译的时候
                                      //

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值