我有两个问题。第一个是将一个中断例程放在一个与main相同的文件中(在一个定义了其他函数的文件中)是个好主意吗?
第二个是,如何从不同文件传递全局指针?为了使自己更容易,指针“指向”全局变量的地址。
文件1 mylib.c
unsigned char b;
unsigned char e; //global variables used for the interrupt routine
unsigned char *bp =&b;
unsigned char *ep = &e;
文件2 mylib.h
extern unsigned char e;
extern unsigned char b;
extern unsigned char *ep;
extern unsigned char *bp;
文件3 main.c
#include "mylib.h"
use (e);
use (b);
use (*ep);
use (*bp);
它指出指针未定义时? 我没有在这里提出的两个问题上找到太多帮助,这就是我发布它的原因,找到答案会很有趣。
编制报告:
10 371 Specifier needed main.c
10 393 'use ' Identifier redefined main.c
11 371 Specifier needed main.c
11 393 'use ' Identifier redefined main.c
答案 0 :(得分:1)
最好在主(?)
的单独文件中设置一个中断例程
这不是C的要求,而是代码的组织问题。是的,将源代码分成逻辑组是很好的。
将中断服务程序(ISR)及其相关函数和变量放在一个单独的文件中是个好主意。
如何从不同文件传递全局指针?
所有文件都可以访问全局标识符(变量,对象,函数),因为它是全局。诀窍是,一个特定的.c文件知道吗?通过在#include "mylib.h"
中加入main.c
,该代码可以识别{em>声明的标识符,例如extern unsigned char *bp;
。
还要考虑:
1)unsigned char b, e;
不需要在全球空间中,因为其他* .c文件可以通过unsigned char *bp
和unsigned char *ep
访问它们。见information hiding
2)名称bp, ep
很短,可能会与其他代码发生冲突。推荐一个提示他们“家”的前缀。
3)指针可能应该是常量并指向volatile
数据,因为它们是ISR的一部分。
// mylib.h
extern volatile unsigned char * const mylib_ep;
extern volatile unsigned char * const mylib_bp;
// mylib.c
static volatile unsigned char b;
static volatile unsigned char e;
volatile unsigned char * const mylib_bp = &b;
volatile unsigned char * const mylib_ep = &e;
// main.c
#include "mylib.h"
// do not use (e);
// do not use (b);
use (*mylib_ep);
use (*mylib_bp);
它指出指针在它们出现时没有定义?
指针在mylib.h
中声明。指针在mylib.c
中定义。
从设计的角度来看,我不会让其他文件像上面那样访问数据。相反,我会创建一个 get 和 set 函数。我假设这两个变量需要以原子的方式进行读/写:两者一起读/写,而不会在get / set期间调用ISR。
void mylib_b_e_get(char *b, char *e);
void mylib_b_e_set(char b, char e);
关于use
的汇编报告反映出尚未声明或定义伪代码函数use()
。