【问题标题】:Creating iterable list of register in embedded C在嵌入式 C 中创建可迭代的寄存器列表
【发布时间】:2018-12-23 12:13:22
【问题描述】:

我一直在使用 python java 和 c++ 进行编程,它们都有预定义的列表对象。我现在正在研究嵌入式 C 中的微控制器,但列表等对象和 printf 等函数根本不存在。

我想要做的是以下。我有多个附加到定义的寄存器。我想把我所有的定义放在一个我可以访问的列表中。

#include <stdlib.h>
#include <stdio.h>
#include <xc.h>

#define KP_ROW1     LATBbits.LATB0
#define KP_ROW2     LATBbits.LATB1
#define KP_ROW3     LATBbits.LATB2
#define KP_ROW4     LATBbits.LATB3
#define KP_COL1     LATBbits.LATB4
#define KP_COL2     LATBbits.LATB5
#define KP_COL3     LATBbits.LATB6
#define KP_COL4     LATBbits.LATB7

KP_ROW = [KP_ROW1, KP_ROW2, KP_ROW3, KP_ROW4]; //error on this line
KP_COL = [KP_COL1, KP_COL2, KP_COL3, KP_COL4]; //error

for(int i=0;i<4;i++)
    {
        if (KP_COL[i] == 1){return 1;}
    }

由于我以前没有 C 嵌入式方面的经验,我认为 google 可以帮助我,但似乎我找到的所有解决方案都需要对结构有很好的理解和真正复杂的函数的制作。

这样做的原因是我可能会有 100 个引脚,我不想为每个引脚都做“if”语句,我想遍历一个列表。我正在使用带有 XC8 编译器的 PIC18F。

我在征求意见。你会怎么做?有没有比创建自己的列表类更快、更简单的方法?

【问题讨论】:

  • 那么你能给我们编译器为错误行发出的错误消息吗?它们看起来像语法错误,如果你有一些 C++ 经验,我会认为你可能能够解释。
  • 所以您想列出对宏的引用?是否保证每个宏都是variable.member
  • 您只需要读取它们,还是也需要写入它们?
  • 我对你想要从这些定义中得到什么感到困惑。似乎每个 KP 定义都是寄存器的地址值,但您正在测试每个是否等于数字(上面的 1)?。

标签: c list struct embedded


【解决方案1】:

很难理解这里需要什么。我了解到您希望在程序中读取 100 寄存器的值。你必须知道他们的地址。然后,您可以创建一系列宏:

#define REG1 0xabcd
#define REG2 0x1234
...

或任何地址。然后,创建更多宏来直接访问这些值:

#define REG1_VAL (*(volatile uint8_t *) REG1)
#define REG2_VAL (*(volatile uint8_t *) REG2)
...

然后您可以编写诸如 REG1_VAL = 1 之类的赋值或诸如 REG1_VAL == 1 之类的测试。否则,您可以创建通过其地址访问其值的宏:

#define READ(reg) (*(volatile uint8_t *) reg)

利用上面的方法获取一个寄存器值则为:

READ(REG1);

然后您可以分配一个包含 100 个元素的数组:

volatile uint8_t regs[100] = {REG1, REG2, ..., REG100};

并遍历该数组:

for (i = 0; i < 100; i ++) {
    if (READ(regs[i]) == 1) {
        ...
    }
}

希望对你有帮助!

注意:这些宏需要微调以避免细微的错误,但我希望它们仍然有助于说明我的意思。

【讨论】:

  • 这正是我想知道的!所以我需要使用地址而不是寄存器值......我只是不知道怎么做。谢谢。
  • 通常,在线库已经为流行的微控制器实现了有用的例程,例如上述例程。那么你就不必处理这些细节了。
  • 您知道 PIC12-18 上的 100 字节是对资源的巨大浪费吗?
  • 是的,但是如果我需要调用 100 个寄存器,你会怎么做?直接打电话给他们?我觉得它会变得越来越混乱,或者我的合作伙伴难以阅读,我不是这个项目中唯一的人
  • @PyThagoras 如果寄存器位于相邻的内存空间中,您可以节省大量内存。在这种情况下,您只需要一个指向第一个指针并通过递增指针来访问其他指针。本质上,就好像数组是为您预定义的一样。
【解决方案2】:

我找到了答案! 它不起作用,因为我试图获取位的地址而不是寄存器......我的错。应该是:

#define KP_ROW LATB

然后添加一些位掩码来写入我想要的引脚。 对不起这个初学者的错误!

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2019-07-05
    • 2021-07-06
    • 2018-05-29
    • 2020-10-20
    相关资源
    最近更新 更多