### 好东西PICC——C语言的点滴 #### 概述 本文主要探讨了在使用Microchip的C编译器(PICC)结合ICD2(In-Circuit Debugger)进行开发过程中的一些细节问题,特别是针对中断处理时的内存管理方面。通过对几个具体示例的分析,我们能够更深入地理解在编写支持中断的代码时所需要注意的关键点。 #### 如何避免ICD2占用的地址被链接器错误分配 当使用ICD2进行在线仿真调试时,它会占用一部分目标芯片的资源。为了避免链接器无意中为其他用途分配已被ICD2占用的地址,从而导致调试过程中的时间浪费,可以采取以下步骤来告知链接器哪些地址已被占用: 1. **配置Hitech C + ICD2:** - 打开MPLAB IDE环境并集成了C编译器。 - 创建项目或者打开已存在的使用Hitech C + ICD2的项目。 - 转至`Project -> Build Options -> Project -> PICC Global`。 - 选择`Compile for ICD`选项,这样编译器就会考虑到ICD2占用的部分资源,并做出相应的调整。 #### 中断中使用的临时变量管理 在讨论临时变量之前,需要明确几个概念: - **临时变量**:在函数内部声明的局部变量,其生命周期通常仅限于该函数的执行周期。 - **全局变量**:在整个程序范围内都可访问的变量。 #### 关于临时变量的重要特性 在PICC中,中断中使用的临时变量具有特殊性,主要表现在: - **中断专用**:中断函数中使用的临时变量不会被其他函数覆盖,即使这些函数也使用相同的局部变量名称。 - **地址不可重叠**:中断函数中使用的临时变量与非中断函数中的临时变量不能共享相同的RAM地址空间,以避免数据冲突。 #### 示例分析 以下通过两个示例来具体说明这些特性。 ##### 示例一 ```c #include "pic.h" unsigned char i, j, k; void fn1(void) { unsigned char s1[40]; s1[0] = 1; } void interruptsample(void) { unsigned char s2[50]; s2[0] = 1; fn1(); } void main(void) { } ``` **说明**: - `i, j, k`:三个全局变量。 - `s1[40]`:中断调用使用的临时变量。 - `s2[50]`:中断中使用的临时变量。 在这个例子中,`bank0`资源已经耗尽,因为: - `s2`使用了50个RAM单元。 - `s1`使用了40个RAM单元。 - 用于保护`W`、`STATUS`和`PCLATH`的额外3个RAM单元。 总计消耗96个RAM单元。因此,在中断之外没有可用的临时变量地址空间,这意味着中断使用的临时变量不会被覆盖。 ##### 示例二 ```c #include "pic.h" unsigned char i, j, k; void fn1(void) { unsigned char s1[20]; s1[0] = 1; } void fn2(void) { unsigned char s3[20]; s3[0] = 1; } void interruptsample(void) { unsigned char s2[50]; s2[0] = 1; fn1(); } void main(void) { fn2(); } ``` **说明**: - `i, j, k`:三个全局变量。 - `s1[20]`:中断调用使用的临时变量。 - `s2[50]`:中断中使用的临时变量。 - `s3[20]`:非中断使用的临时变量。 这个例子进一步说明了中断内外使用的临时变量地址空间不可重叠。中断函数内的`s2`数组与非中断函数中的`s3`数组不能共享相同的空间。 #### 中断函数的实现 接下来,我们通过一个具体的例子来观察在不同情况下,中断处理函数的编译结果有何不同。 1. **不执行任何操作的中断处理函数**: ```c void interruptsample(void) { } ``` 编译后的结果是直接返回。 2. **在中断处理函数中增加对全局变量的操作**: ```c void interruptsample(void) { i++; } ``` 此时编译器会为保存和恢复`W`寄存器和`STATUS`寄存器的状态添加额外的指令。 3. **中断处理函数中调用一个涉及全局变量和局部变量的函数`fn()`**: ```c void fn(void) { char temp; temp = i + j; i = temp++; } void interruptsample(void) { // 待续 } ``` 在这种情况下,中断处理函数调用`fn()`时,编译器同样需要为保存和恢复状态而添加额外的指令。 #### 总结 通过以上分析,我们可以得出以下结论: - 使用ICD2进行在线仿真调试时,需要确保链接器不会错误地为其他用途分配已被ICD2占用的地址。 - 在编写支持中断的代码时,需要注意中断中使用的临时变量具有特殊的管理方式,以避免数据冲突。 - 在处理中断时,涉及到全局变量的操作需要特别注意编译器生成的代码,以确保正确性和效率。 通过了解这些细节,开发者可以在使用Microchip的C编译器(PICC)结合ICD2进行开发时更加高效且准确地完成任务。
剩余15页未读,继续阅读
- 粉丝: 0
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助