问题描述
我正在为我的 stm32f429 板编写嵌入式操作系统代码.我正在测试这段代码的经过时间:
I'm writing a code for embedded OS for my stm32f429 board. I'm testing this code for elapsed time:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <stdint.h>
#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<<0)
#define DWT_CYCCNT ((volatile uint32_t *)0xE0001004)
#define CPU_CYCLES *DWT_CYCCNT
#define STOPWATCH_START { m_nStart = *(*(volatile unsigned int*)0xE0001004);}//DWT_CYCCNT;}
#define STOPWATCH_STOP { m_nStop = *(*(volatile unsigned int *)0xE0001004);}
static inline void stopwatch_reset(void)
{
/* Enable DWT */
DEMCR |= DEMCR_TRCENA;
*DWT_CYCCNT = 0;
/* Enable CPU cycle counter */
DWT_CTRL |= CYCCNTENA;
}
static inline uint32_t stopwatch_getticks()
{
return CPU_CYCLES;
}
static inline void stopwatch_delay(uint32_t ticks)
{
stopwatch_reset();
while(1)
{
if (stopwatch_getticks() >= 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 中.也许我在寄存器上有问题 (?).
It compiles without errors, but when I run this program on my stm32f429, I obtain a SEGV error, probably in the #define STOPWATCH_START. Maybe I have problems on registers (?).
代码是http://pastebin.com/qr6sF9eU(它删除了我对系统调用的调用使用)
The code is http://pastebin.com/qr6sF9eU (It deleted the calling to system call that I use)
make 的输出为:http://pastebin.com/Q14xTaXH
The output of make is: http://pastebin.com/Q14xTaXH
我在 stm32f429 板上运行测试时的输出是:http://pastebin.com/sGmjZjxj
The output when I run my test on stm32f429 board is: http://pastebin.com/sGmjZjxj
你能帮我吗?
推荐答案
NVIC 寄存器很可能受 MPU 保护,用户代码无法访问.使用操作系统时,您不能搞砸一切.
NVIC registers are most likely protected by MPU and not accessible to user code. You cannot mess with everything when using an operating system.
这篇关于ARM Cortex M4 处理器中经过时间的测试 C 代码中的错误 SEGV的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!