您好!
在使用 SysCtlReset() API 进行软件复位时、MSP432E401Y 的 RAM 会发生什么情况?
谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
在使用 SysCtlReset() API 进行软件复位时、MSP432E401Y 的 RAM 会发生什么情况?
谢谢
您好!
好的,我使用 memset()重置内存。
char * test = malloc (100); //假设在0x20007894上测试分配的内存块。
then ifi reset code usingSysCtlReset() API then can my code able to allocate newdynamic block on that location (0x20007894)?
Thnaks
dinkar
您好 Dinkar、
如果通过调用 SysCtlReset()来重置程序,则将分配给*test 的相同内存块。 这是因为一旦你从 main()运行 BIOS_start()函数,TIRTOS 将重新初始化自身并重置其整个状态,包括分配的堆内存的状态。 这与 RAM 状态是否被保留无关、因为默认情况下、您的所有代码都被放置在链接期间的闪存中。
鉴于编译器应仅使用 RAM 来临时存储数据、因此在代码复位时、RAM 是否处于非复位状态无关紧要。 RAM 用于为堆栈自动分配数据、当数据进入和退出范围时、程序会定期重复使用这些数据。 它还用于数据的动态分配、如上所述、这不需要 RAM 的状态完全清除、因为 RTOS 将重新初始化其堆存储器表。
您可以通过在程序的 mainThread()中运行以下测试代码来自行测试此行为:
//memory/reset 测试 volatile int i =0; while (i=0); In*y; y =(易失性 int*)(0x20000000+0x00040000-250); * y = 0x3010; someHeap =(int*) malloc (400); while (i=0){ } SysCtlReset();
您需要像这样调整.cmd 文件中程序的内存映射、以确保完全安全:
内存 { 闪存(RX):origin = 0x00000000,length = 0x00100000 SRAM (rwx):origin = 0x20000000,length = 0x00040000-250 SRAM_EX (Rwx):origin = 0x20000000+0x00040000-250,length = 250 }
如果您运行该代码、则会在第一个 while (i=0)时卡住。 但是、在调试模式下、您可以将 PC 指向任何可执行指令、并且可以使用该功能跳过 while (i=0)循环。 如果您跳转到第二个部分、您将看到 RAM 被写入、并且 malloc 被调用以提供指向 someteHeap 的指针。 记录堆存储器地址以供参考后、您可以跳转至 SysCtlReset()调用。 这将使您返回到第一个 while 环路。 此时、您可以检查先前写入地址 y 的数据、以验证 RAM 是否未复位。 然后、如果你跳回到 malloc、你将观察到、尽管 RAM 被完全保留、RTOS 将为某些堆提供与第一次迭代预复位相同的内存块。
如果您需要对上述解释进行更多的澄清,或者您对 SysCtlReset()有进一步的问题,请告诉我。
此致、
Michael