gpt4 book ai didi

c - 在 MSP430 上,当我取消引用空指针时会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 15:00:27 25 4
gpt4 key购买 nike

我知道取消引用空指针是未定义的 - 但我想知道在特定目标 - MSP430 上会发生什么。

我面前没有可以加载它的电路板来立即测试它。

如果我这样做(或类似)会发生什么?

int * foo = NULL;
(*foo)++; //Crash?

位置 0x0 在 SFR 范围内并被保留。

它会生成 PUC/POR 吗?或者它会默默地“工作”吗?

生成的程序集是

;int * foo = NULL;
clr.w R15
;(*foo)++;
inc.w R15

所以位置 0x0 实际上是递增 1。

当我在模拟器中运行它时,我看到地址 0x0 处的值从 0 变为 1。我在调试日志中没有收到任何警告,程序正常退出。

我正在使用 IAR EW430 编译器/汇编器/模拟器。

最佳答案

不仅写入和读取地址 0x0 不会导致死机或重启,它实际上是 MSP430 应用程序经常使用的完全合法的操作。

初始部分或 MSP430 内存映射保留用于 I/O 端口和控制寄存器:http://en.wikipedia.org/wiki/TI_MSP430#MSP430_address_space

具体来说,0x0及后续地址的控制寄存器是:

 #define IE1_                  0x0000    /* Interrupt Enable 1 */
#define IE2_ 0x0001 /* Interrupt Enable 2 */
#define IFG1_ 0x0002 /* Interrupt Flag 1 */
#define IFG2_ 0x0003 /* Interrupt Flag 2 */

例如,通过取消引用 uint8_t *uint16_t * 指针将零写入该内存地址将禁用中断。通过取消引用 uint32_t * 写入零,它也将清除标志。增加这些寄存器的值没有多大意义,但应该是完全合法的。

至少在 msp430 系列 1、系列 2 和系列 4 上是这种情况。通过检查头文件,我无法在系列 5 上找到任何映射到 0x0 的内容(中断控制寄存器映射到从 0x0100 开始的区域).

因此,如果您想在代码中找到取消引用 NULL 指针的地方,您完全需要靠自己。

关于c - 在 MSP430 上,当我取消引用空指针时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27672979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com