测试C代码中的SEGV在ARM Cortex M4处理器中经过的时间内出错

我正在为我的stm32f429板编写嵌入式操作系统的代码。 我正在测试此代码的使用时间:

#include  #include  #include  #include  #include  #include  #define DEFAULT_DELAY 1 uint32_t m_nStart; //DEBUG Stopwatch start cycle counter value uint32_t m_nStop; //DEBUG Stopwatch stop cycle counter value #define DEMCR_TRCENA 0x01000000 /* Core Debug registers */ #define DEMCR (*((volatile uint32_t *)0xE000EDFC)) #define DWT_CTRL (*(volatile uint32_t *)0xE0001000) #define CYCCNTENA (1<= ticks) break; } } uint32_t CalcNanosecondsFromStopwatch(uint32_t nStart, uint32_t nStop) { uint32_t nTemp; uint32_t n; uint32_t SystemCoreClock = 180000000; nTemp = nStop - nStart; nTemp *= 1000; // Scale cycles by 1000. n = SystemCoreClock / 1000000; // Convert Hz to MHz nTemp = nTemp / n; // nanosec = (Cycles * 1000) / (Cycles/microsec) return nTemp; } int main( int argc, char **argv ) { int delay = DEFAULT_DELAY; // Initial value for the delay int timeDiff = 0; STOPWATCH_START; printf("Try\n\n"); STOPWATCH_STOP; timeDiff = CalcNanosecondsFromStopwatch(m_nStart, m_nStop); printf("My function took %d nanoseconds\n", timeDiff); return( 0 ); } 

它编译没有错误,但是当我在我的stm32f429上运行这个程序时,我得到了一个SEGV错误,可能在#define STOPWATCH_START中。 也许我在寄存器上有问题(?)。

代码是http://pastebin.com/qr6sF9eU (它删除了我使用的系统调用的调用)

make的输出是: http : //pastebin.com/Q14xTaXH

我在stm32f429板上运行测试时的输出是: http ://pastebin.com/sGmjZjxj

你能帮助我吗?

NVIC寄存器很可能受MPU保护,用户代码无法访问。 使用操作系统时,不能搞砸一切。

您无法在#define获取SEGV ,因为#define是预处理程序指令,并且不构成输出的一部分。 它可能位于#define生成的代码中。 你是故意从0xE0001004读取地址,读取该地址的内容作为另一个地址,然后读取其中的内容? 这听起来不太可能是操作时钟的方式。

STOPWATCH_START;STOPWATCH_STOP; 从我的编译器导致“非法间接”错误。 双指针引用使得读取的计数器值用作指针。

 #define STOPWATCH_START { m_nStart = *(*(volatile unsigned int*)0xE0001004);} #define STOPWATCH_STOP { m_nStop = *(*(volatile unsigned int *)0xE0001004);} 

根据您的其他#define语句及其中的地址,应该是这些

 #define STOPWATCH_START { m_nStart = CPU_CYCLES;} #define STOPWATCH_STOP { m_nStop = CPU_CYCLES;} 

正如你在代码中的其他地方使用的那样?