power568 发表于 2017-9-13 17:20:25

L052函数内使用 #if 0 后程序运行异常

      最近在调试低功耗,进入低功耗函数如下:

void vMcuEnterStopMode(void)
{
       //// for test
#if 1
       
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
        HAL_PWREx_EnableUltraLowPower();
        HAL_PWREx_EnableFastWakeUp();
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
       
        SystemClock_Config();
       
#endif
}   #if 1时进入低功耗功能正常,但是当为#if 0时,程序异常,会停留在main函数开始出的延时处,当时奇怪的是打断点(断点必须在停留延时函数之后)调试时可以的,就是全速仿真运行或者真正运行时功能异常。    停留函数如下:

void GpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct;

__HAL_RCC_GPIOB_CLK_ENABLE();
       
HAL_GPIO_WritePin(RESET_ASSIST_GPIO_Port, RESET_ASSIST_Pin, GPIO_PIN_RESET);

GPIO_InitStruct.Pin = RESET_ASSIST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(RESET_ASSIST_GPIO_Port, &GPIO_InitStruct);
        HAL_GPIO_WritePin(RESET_ASSIST_GPIO_Port, RESET_ASSIST_Pin, GPIO_PIN_RESET);
        Delay16(6000);
       
GPIO_InitStruct.Pin = RESET_ASSIST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(RESET_ASSIST_GPIO_Port, &GPIO_InitStruct);
}   但是将延时函数直接顶替该函数后,功能又正常。   在该函数之前还有大约5ms的延时,将延时增加到30Ms后,功能又正常。

   不知道什么原因???
   各位大侠请支招哦。谢谢!!!



发表于 2017-9-14 08:12:26

首先要明白#if的功能,如果是#if 0...#endif 这段代码是不编译的。

MrJiu 发表于 2017-9-14 10:46:29

首先要搞清预编译和代码得区别。。。预编译是指编译器执行的。。。而真正得代码是MCU执行。。两者有本质区别哦。。。。

power568 发表于 2017-9-14 13:24:48

安 发表于 2017-9-14 08:12
首先要明白#if的功能,如果是#if 0...#endif 这段代码是不编译的。

要的就是比编译这个功能,因为调试时进入低功耗比较麻烦,本想用这个功能来屏蔽这部分代码使该函数为空函数,以为空函数不影响,但是好像还是有影响

power568 发表于 2017-9-14 13:26:38

MrJiu 发表于 2017-9-14 10:46
首先要搞清预编译和代码得区别。。。预编译是指编译器执行的。。。而真正得代码是MCU执行。。两者有本质区 ...

我以为怕屏蔽了后是空函数,应该能正常工作,但是工作异常,问题是影响的地方居然不是函数调用的地方,所以有点疑惑...

MrJiu 发表于 2017-9-14 13:49:05

power568 发表于 2017-9-14 13:26
我以为怕屏蔽了后是空函数,应该能正常工作,但是工作异常,问题是影响的地方居然不是函数调用的地方,所 ...

那你把main函数也贴出来看看。。。。

发表于 2017-9-14 13:57:16

楼主的意思是Delay16(6000);应该停留在这里吗?
如果这个也不能工作,可能是被优化了,顺便发一下Delay16(6000)的函数。

power568 发表于 2017-9-15 11:45:00

MrJiu 发表于 2017-9-14 13:49
那你把main函数也贴出来看看。。。。

   main函数没有太多的东西,都是初始化,如下:

int main(void)
{

/* USER CODE BEGIN 1 */
        Delay16(1000); /* USER CODE END 1 */
        ResetSlaveMcu();
       
        vReadDeviceInforFromFlash(DEVICE_INFO_ADDRESS, &Set_distance_data, 1 );
        vReadDeviceInforFromFlash(DEVICE_VOICE_ADDRESS, &AlarmVoiceIndex, 1 );
        if ( (9>AlarmVoiceIndex) || (11<AlarmVoiceIndex) )
        {
                AlarmVoiceIndex = 9;
        }
#if 0 ////for test
        uint16_t temp_flash_data_rewrite = 1;
        vWriteDeviceInforToFlash(DEVICE_MODE_ADDRESS, (uint16_t *)&temp_flash_data_rewrite, 1);
#endif
        vReadDeviceInforFromFlash(DEVICE_MODE_ADDRESS, (uint16_t *)&System_mode, 1 );

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();
       
/* Initialize all configured peripherals */
MX_GPIO_Init();
       
MX_DMA_Init();
MX_ADC_Init();
MX_RTC_Init();
MX_SPI1_Init();
MX_USART2_UART_Init();

/* USER CODE BEGIN 2 */
        __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
#if 0
MX_USART1_UART_Init();
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
#endif
       
        DataStructInit();
       
        AppStartAdc();
       
        AppSlaveModeSet(&MainCmdDeal);
       
        AppIwdgInit();
/* USER CODE END 2 */

       
/* Infinite loop */
/* USER CODE BEGIN WHILE */
       
while (1)
{
                switch (System_mode)
                {
                        case 2: //// sleep
                        {
                                AppSleepMode(&MainCmdDeal);
                                break;
                        }
                        case 1: //// active
                        {
                                AppActiveMode(&MainCmdDeal);
                                break;
                        }
                        case 0xFFFF: //// first start up
                        {
                                AppFirstStartUp(&MainCmdDeal);
                                break;
                        }
                        default: //// for active
                        {
                                AppDefault(&MainCmdDeal);
                                break;
                        }
                }
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}
/* USER CODE END 3 */

}

power568 发表于 2017-9-15 11:45:46

本帖最后由 power568 于 2017-9-15 12:26 编辑

安 发表于 2017-9-14 13:57
楼主的意思是Delay16(6000);应该停留在这里吗?
如果这个也不能工作,可能是被优化了,顺便发一下Delay ...       是卡在Delay16(6000)的延时函数之内。       应该不是优化的问题,使用的是IAR,优化等级为Low。

void Delay16(uint16_t n)
{
      uint16_t tt;
      for(tt = 0;tt<n;tt++);
      for(tt = 0;tt<n;tt++);
      for(tt = 0;tt<n;tt++);
      for(tt = 0;tt<n;tt++);
      for(tt = 0;tt<n;tt++);
}

power568 发表于 2017-9-15 12:23:54

       仿真全速运行时,使用软件复位命令后,程序卡在函数内ResetSlaveMcu的延时函数中,暂停后单步跳出该函数又可以全速运行;但是全速运行时在该函数之后打断点有不会卡住...
页: [1] 2
查看完整版本: L052函数内使用 #if 0 后程序运行异常