【发布时间】:2019-04-12 09:45:41
【问题描述】:
因此,我们正在尝试一种方法来执行一些矩阵数学运算。这是嵌入式的,因此内存是有限的,而且我们将拥有大型矩阵,因此它有助于我们将其中一些存储在闪存中而不是 RAM 中。
我编写了一个矩阵结构、两个数组(一个 const/flash 和另一个 RAM)以及一个“修改”和“获取”函数。一个矩阵,我初始化为 RAM 数据,另一个矩阵我初始化为闪存数据,使用从 const *f32 到 *f32 的转换。
我发现当我在我的 STM32 嵌入式处理器上运行此代码时,RAM 矩阵是可修改的,指向闪存数据的矩阵根本不会改变(设置为 12.0 不会“占用”,值保持为 2.0)。
(更改前)a=2,b=2,(更改后)c=2,d=12
这是可接受的行为,根据设计,我们不会尝试修改闪存数据矩阵,但如果我们犯了错误,我们不希望它崩溃。
但是,如果我在我的 Windows 机器上使用 Visual C++ 运行相同的代码,当我尝试运行下面的代码时,当我尝试将 const 数组修改为 12.0 时,我会遇到“访问冲突”。
Windows 会反对这并不奇怪,但我想更好地理解行为上的差异。这似乎与 CPU 架构有关。在我们的 STM32 上,让代码尝试写入 const 数组并让它不起作用是否安全?或者是否有副作用,或避免这种情况的原因?
static const f32 constarray[9] = {1,2,3,1,2,3,1,2,3};
static f32 ramarray[9] = {1,2,3,1,2,3,1,2,3};
typedef struct {
u16 rows;
u16 cols;
f32 * mat;
} matrix_versatile;
void modify_versatile_matrix(matrix_versatile * m, uint16_t r, uint16_t c, double new_value)
{
m->mat[r * m->cols + c] = new_value;
}
double get_versatile_matrix_value(matrix_versatile * m, uint16_t r, uint16_t c)
{
return m->mat[r * m->cols + c];
}
double a;
double b;
double c;
double d;
int main(void)
{
matrix_versatile matrix_with_const_data;
matrix_versatile matrix_with_ram_data;
matrix_with_const_data.cols = 3;
matrix_with_const_data.rows = 3;
matrix_with_const_data.mat = (f32 *) constarray;
matrix_with_ram_data.cols = 3;
matrix_with_ram_data.rows = 3;
matrix_with_ram_data.mat = ramarray;
a = get_versatile_matrix_value(&matrix_with_const_data, 1, 1);
b = get_versatile_matrix_value(&matrix_with_ram_data, 1, 1);
modify_versatile_matrix(&matrix_with_const_data, 1, 1, 12.0);
modify_versatile_matrix(&matrix_with_ram_data, 1, 1, 12.0);
c = get_versatile_matrix_value(&matrix_with_const_data, 1, 1);
d = get_versatile_matrix_value(&matrix_with_ram_data, 1, 1);
【问题讨论】:
标签: visual-c++ embedded stm32