将全局指针传递给多个文件以执行中断例程

时间:2016-03-07 12:30:06

标签: c pointers embedded interrupt

我有两个问题。第一个是将一个中断例程放在一个与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

1 个答案:

答案 0 :(得分:1)

  

最好在主(?)

的单独文件中设置一个中断例程

这不是C的要求,而是代码的组织问题。是的,将源代码分成逻辑组是很好的。

将中断服务程序(ISR)及其相关函数和变量放在一个单独的文件中是个好主意。

  

如何从不同文件传递全局指针?

所有文件都可以访问全局标识符(变量,对象,函数),因为它是全局。诀窍是,一个特定的.c文件知道吗?通过在#include "mylib.h"中加入main.c,该代码可以识别{em>声明的标识符,例如extern unsigned char *bp;

还要考虑:

1)unsigned char b, e;不需要在全球空间中,因为其他* .c文件可以通过unsigned char *bpunsigned 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()