sunnydragon 发表于 2011-12-16 11:55:39

将RT-thread从0.3.2升级到0.4.0 rc1后,rt_thread_delay()变慢问题

大家好,之前一直用的0.3.2版本的系统,系统运行挺稳定,rt_thread_delay也非常的精确。现在换成了0.4.0 rc1版本后,系统能运行起来,但是感觉rt_thread_delay()比以前慢了大概2倍左右,我是通过LED的闪烁观察出来的。以为硬件没变,只能考虑软件问题,开始以为是SysTick配置问题,单步调试发现SysTick_Configuration()中的各个参数都和之前的一模一样,rtconfig.h也没有做改动,软件这块想不出来还有什么地方会影响到rt_thread_delay()。现在不知道下一步该怎么找问题的根源,希望大家给多指点下啊~

ffxz 发表于 2011-12-16 12:03:51

回复【楼主位】sunnydragon
-----------------------------------------------------------------------

是哪个硬件平台?

sunnydragon 发表于 2011-12-16 12:39:55

回复【1楼】ffxz
-----------------------------------------------------------------------

STM32F107VCT6

sunnydragon 发表于 2011-12-16 19:49:04

自己顶一下~

aozima 发表于 2011-12-16 21:50:10

请确认启动文件和型号的定义是对的(STM32F10X_CL)。
还项目中没有在别处修改过时钟。

以及 RT_TICK_PER_SECOND 的值在可实现范围。
因为systick的定时器是24位的。(如果超出,请选择HSE为时钟源)

建议使用 工程向导 来生成工程。

sunnydragon 发表于 2011-12-17 16:44:46

回复【4楼】aozima
-----------------------------------------------------------------------
1.有点不明白,我只要在RCC初始化的时候将底下语句注释掉,就能正常运行。
    //PLL设置SYSCLK/1 * 9 = 8*1*9 = 72MHz
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
2.或者把工程配置里的预定义的 STM32F10X_CL 去掉也能正常运行。

现在基本上可以确定变慢不是操作系统的原因。以前用的STM32F103的工程配置里的预定义的是 STM32F10X_MD,在换成107以后改成STM32F10X_CL导致系统出现了时钟问题。

以下是我RCC配置的函数,大家帮忙看下有没有不妥的地方,或者还有什么地方可能导致问题。(芯片:STM32F107VCT6 外部晶振:8M)
static void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;

    //使能外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部晶振稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    //如果外部晶振启动成功,则进行下一步操作
    if(HSEStartUpStatus==SUCCESS)
    {
      //设置HCLK(AHB时钟)=SYSCLK
      RCC_HCLKConfig(RCC_SYSCLK_Div1);

      //PCLK1(APB1) = HCLK/2
      RCC_PCLK1Config(RCC_HCLK_Div2);

      //PCLK2(APB2) = HCLK
      RCC_PCLK2Config(RCC_HCLK_Div1);

      //FLASH时序控制
      //推荐值:SYSCLK = 0~24MHz   Latency=0
      //      SYSCLK = 24~48MHzLatency=1
      //      SYSCLK = 48~72MHzLatency=2
      FLASH_SetLatency(FLASH_Latency_2);
      //开启FLASH预取指功能
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

      //PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
      RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
      //启动PLL
      RCC_PLLCmd(ENABLE);
      //等待PLL稳定
      while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
               
      //系统时钟SYSCLK来自PLL输出
      RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
      //切换时钟后等待系统时钟稳定
      while(RCC_GetSYSCLKSource()!=0x08);               
      /*
      //设置系统SYSCLK时钟为HSE输入
      RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
      //等待时钟切换成功
      while(RCC_GetSYSCLKSource() != 0x04);
      */
    }

    //下面是给各模块开启时钟
    //启动GPIO
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
                           RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | \
                                                   RCC_APB2Periph_GPIOE ,
                           ENABLE);
    //启动AFIO
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    //启动USART1 USART2
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    //启动DMA时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        /* Timer2 Periph clock enable */
//        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        /* Enable ADC1 and GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
}

aozima 发表于 2011-12-17 17:44:55

“现在基本上可以确定变慢不是操作系统的原因”必须的。

CL都25M晶振,如果自己改8M,还是得要用CL的启动文件,
RCC整个部分都要自己调整并保证原有的获取系统时钟的变量或函数都是正确的。

marrylilili 发表于 2011-12-19 22:18:16

学习了
页: [1]
查看完整版本: 将RT-thread从0.3.2升级到0.4.0 rc1后,rt_thread_delay()变慢问题