Chr*_*ris 0 embedded stm32 visual-c++
所以,我们正在尝试一种方法来执行一些矩阵数学.这是嵌入式的,因此内存是有限的,我们将有大型矩阵,因此它可以帮助我们将其中的一些存储在闪存而不是RAM中.
我写了一个矩阵结构,两个数组(一个const/flash和另一个RAM),以及一个"修改"和"获取"功能.一个矩阵,我初始化为RAM数据,另一个矩阵我初始化为闪存数据,使用从const*f32到*f32的转换.
我发现当我在STM32嵌入式处理器上运行此代码时,RAM矩阵是可修改的,指向闪存数据的矩阵根本不会改变(设置为12.0不"取",值仍然2.0).
(在改变之前)a = 2,b = 2,(改变之后)c = 2,d = 12
这是可接受的行为,通过设计我们不会尝试修改闪存数据的矩阵,但如果我们犯了错误,我们不希望它崩溃.
但是,如果我使用Visual C++在我的Windows机器上运行相同的代码,当我尝试运行下面的代码时,当我尝试将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);
Run Code Online (Sandbox Code Playgroud)
但如果我们犯了错误,我们不希望它崩溃.
尝试写入ROM本身并不会导致崩溃,但是尝试编写它的代码根据定义是错误的,并且在任何情况下都可能崩溃,并且肯定不会按预期运行.
这几乎是完全错误的思考; 如果你有一个bug,你真的希望它在开发过程中崩溃,而不是在部署之后崩溃.如果它默默地做了错误的事情,你可能永远不会注意到这个错误,或者崩溃可能发生在除了bug附近之外的其他地方,所以很难找到.
如果您尝试写入标记为只读的内存,则MMU或MPU的体系结构可能会发出异常.这就是Windows中发生的事情.在这种情况下,如果异常处理程序通过某种方式报告此类错误,它可能是一个有用的调试辅助工具.在这种情况下,错误会在发生时准确报告,而不是在访问某些无效数据或执行不正确的结果时崩溃一段时间.
一些,但mot所有STM32部件包括MPU(应用说明)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |