【问题标题】:Defining an array in flash在 Flash 中定义一个数组
【发布时间】:2021-04-26 05:41:57
【问题描述】:

我需要定义不同大小的不同数组并将它们定位在闪存中。我在编译时知道第一个元素的值,结束限制值,让我们调用是一个步骤值。比如第一个元素是1,步长是0.9,极限是5。所以我的数组应该是这样的

const my_arr[] = {1.0, 1.9, 2.8, 3.7, 4.6};

你能帮我用 C 预处理器初始化这样的数组吗?

PS:这是针对微控制器的,因此修饰符 const 会将其放入闪存中,而不是 RAM 中

【问题讨论】:

  • 预处理器不够完善,无法做到这一点。
  • 这个问题很不清楚。你问如何在闪存中放置一个阵列?或者一般如何定义数组?
  • 问题与预处理器无关。但这和你工作的环境有很大关系。比如你用的是什么编译器?你是如何构建应用程序的?您对对象和可执行文件中的(如数据、bss、文本等)了解多少?
  • 建议编写一个输出C源代码的程序。
  • @EugeneSh。应该是uC。最简单的解决方案是用您喜欢的语言编写另一个程序来生成这样的代码,并将对该程序的调用添加到您的 makefile。

标签: c preprocessor


【解决方案1】:

C 预处理器无法识别浮点数

#include <stdio.h>

#define START 100
#define STEP 90
#define LIMIT 500

int my_arr[] = {
START ,
#if START + STEP < LIMIT
START + STEP ,
#if START + STEP + STEP < LIMIT
START + STEP + STEP ,
#if START + STEP + STEP + STEP < LIMIT
START + STEP + STEP + STEP ,
#if START + STEP + STEP + STEP + STEP < LIMIT
START + STEP + STEP + STEP + STEP ,
#if START + STEP + STEP + STEP + STEP + STEP < LIMIT
START + STEP + STEP + STEP + STEP + STEP ,
#endif
#endif
#endif
#endif
#endif
};

int main(void) {
    for (int k = 0; k < sizeof my_arr / sizeof *my_arr; k++) {
        printf("%g ", my_arr[k]/100.0);
    }
    puts("");
    return 0;
}

输出:

1 1.9 2.8 3.7 4.6

【讨论】:

  • 如果我只有一个或两个这样的数组,那么我会手动输入它,但是太多了,所以我需要一个宏来这样做。另外,sizeof 不一定是一个小数字...
  • 嗯 ... C 预处理器不做循环 ... 但请参阅 99 bottles of beer
  • @Submin 您需要编写另一个 C 程序或例如 python 脚本来生成这些初始化。
猜你喜欢
  • 2011-05-03
  • 2012-02-05
  • 2011-02-06
  • 2018-11-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多