在 ARM Cortex M4 处理器中经过的测试中测试 C 代码中出现错误 SEGV



我正在为我的stm32f429板编写嵌入式操作系统的代码。我正在测试这段代码的经过时间:

#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("Trynn");
    STOPWATCH_STOP;
    timeDiff = CalcNanosecondsFromStopwatch(m_nStart, m_nStop);
    printf("My function took %d nanosecondsn", 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;}

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

最新更新