【问题标题】:Error SEGV in test C code on elapsed time in ARM Cortex M4 processorARM Cortex M4 处理器中经过时间的测试 C 代码中的错误 SEGV
【发布时间】:2014-11-23 18:00:25
【问题描述】:

我正在为我的 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("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

你能帮帮我吗?

【问题讨论】:

  • 你没有得到一个明显的“赋值从没有强制转换的整数中生成指针”警告吗?你已经有了一个非常好的定义;为什么不直接使用#define STOPWATCH_START { m_nStart = CPU_CYCLES; } 而不是复制代码并在过程中引入虚假的双重取消引用?
  • 嗨,不喜欢那个。我再次获得了 SEGV,同样是#define STOPWATCH_START { m_nStart = CPU_CYCLES;} #define STOPWATCH_STOP { m_nStop = CPU_CYCLES;}
  • 没有操作系统和 MMU 的微控制器究竟如何“给出分段错误”?你能更具体一点吗,因为你描述的东西在这个微控制器上是完全不可能的......
  • 嗨肖邦!我正在为我的板上的嵌入式操作系统编写代码。然后我的整个代码是pastebin.com/qr6sF9eU(它删除了对我使用的系统调用的调用)make的输出是:pastebin.com/Q14xTaXH我在stm32f429板上运行测试时的输出是:pastebin.com/sGmjZjxj

标签: c assembly time arm stm32


【解决方案1】:

NVIC 寄存器很可能受 MPU 保护,用户代码无法访问。使用操作系统时,您不能乱七八糟。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对不起。我正在为我的 stm32f429 上的嵌入式操作系统编写代码。当我在我的板上运行测试应用程序时出现此错误
    【解决方案3】:

    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;}
    

    你在代码的其他地方使用过吗?

    【讨论】:

    • 你好 Vane。我没有在其他地方使用它们。但是,如果我定义 #define STOPWATCH_START { m_nStart = CPU_CYCLES;} #define STOPWATCH_STOP { m_nStart = CPU_CYCLES;} ,它也会继续给我 SEGV :(
    • 你不在其他地方使用CPU_CYCLES?那么这个功能是什么? static inline uint32_t stopwatch_getticks() {return CPU_CYCLES;}?
    • 对不起,我还以为你在别处说--> 国外我上面显示的所有代码,因为我写了上面的代码
    • 我补充说我正在为 stm32f429 上的嵌入式操作系统编写代码
    猜你喜欢
    • 2018-12-04
    • 2015-01-21
    • 2020-01-10
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2015-03-12
    • 2015-07-19
    相关资源
    最近更新 更多