Jump to content

    

Отладчик Keil MDK вытворяет непонятное

Друзья,

столкнулся с непонятным глюком отладчика Keil MDK 5.24.2 при изучении примера SPI  на отладочной плате STM32F746-Discovery:

При попытке пошагово пройти программу отладчик совершает невероятные прыжки то вверх по коду то на много команд вперед, потом снова назад, хотя программа линейная.

Если просто запустить без отладки, то программа один раз выполняется правильно, но при попытке ее зациклить с помощью "goto" она намертво где-то виснет.

Что посоветуете ?

 

Та же программа на отладочной плате STM32VL-Discovery (STM32F100) работает прекрасно и отладчик ведет себя хорошо.

Edited by TOG

Share this post


Link to post
Share on other sites
9 минут назад, TOG сказал:

Что посоветуете ?

Выключить оптимизацию.

Share this post


Link to post
Share on other sites

1. Компиляция с оптимизация меняет порядок и оптимизирует несколько строк си в один блок ассемблерных команд. Поэтому если шагать в си коде курсов будет прыгать.

2. Кэши включены
 

Share this post


Link to post
Share on other sites

Что посоветуете ?


На ассемблере эту тестуху написать (практически не шучу) - кроме вашего кода не будет ничего... Вопросов подобных просто не возникнет.

Share this post


Link to post
Share on other sites

Спасибо друзья.

Выключил оптимизацию и отладчик заработал как надо. Выключил кэши и программа заработала как надо.

Одно не пойму. Это ведь пример из Cube F7, и там эти кэши включены были. Почему мне пришлось их выключить чтобы пример заработал ?

Edited by TOG

Share this post


Link to post
Share on other sites
15 minutes ago, TOG said:

Почему мне пришлось их выключить чтобы пример заработал ?

Как бэ буду капитаном, но... найдите темы про куб на форуме... и придите в квыводу, что его выбросить надо, и надо начать с чтение документации))))

Share this post


Link to post
Share on other sites

Столкнулся с такой проблемой на Keil (5.29)

Для проекта на STM32F427 не работает SPL,... ну как "не работает"... 

Например настройка clock и PLL проходит, SystemCoreClock равный 180000000 устанавливается, 

но стоит вызвать SystemCoreClockUpdate(), как она сбрасывается в 0.

"возвращаю" SystemCoreClock = 180000000;, камень запустился;

 

Дебажу SystemCoreClockUpdate(), внутри все временные переменные не отрабатываются, всегда 0.

 

Аналогично при и инициализации UART 

	USART_StructInit(&USART_InitStructure);
	USART_InitStructure.USART_BaudRate            	= 9600; 				
	USART_InitStructure.USART_WordLength          	= USART_WordLength_8b;  
	USART_InitStructure.USART_StopBits 				= USART_StopBits_1; 	
	USART_InitStructure.USART_Parity    			= USART_Parity_Even;	
	USART_InitStructure.USART_HardwareFlowControl 	= USART_HardwareFlowControl_None;          
	USART_InitStructure.USART_Mode                	= USART_Mode_Rx | USART_Mode_Tx;   
	USART_Init(USART_1RS485, &USART_InitStructure);

BRR = 0, т.е. настройки порта не устанавливаются

а флаги разрешения прерывания ставятся нормально

	
	NVIC_InitStructure.NVIC_IRQChannel = USART_1RS485_IRQn;	// UART7_IRQn
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  	
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	USART_ITConfig(USART_1RS485, USART_IT_RXNE, ENABLE);
	NVIC_EnableIRQ (USART_1RS485_IRQn);        

	USART_ClearITPendingBit(USART_1RS485, USART_IT_RXNE);
	USART_ClearITPendingBit(USART_1RS485, USART_IT_TXE);
	USART_ClearITPendingBit(USART_1RS485, USART_IT_TC);
	USART_ClearITPendingBit(USART_1RS485, USART_IT_ORE_RX);
	
	USART_Cmd(USART_1RS485, ENABLE);

Но прерывания по приему не возникает ...

--------

Прерывание от SysTim работает нормально, при инициализации

uint8_t SysTim_Init(uint16_t Tick) 	
{                                  	
    uint8_t result = 0;
    if ((Tick>4) && (Tick<=1000)){
        _iSysTick_Counter = 0;
        _iSysTick_Step = 1000 / Tick;
        if (_iSysTick_Step != 0){
            if (SysTick_Config(SystemCoreClock / Tick) == 0){
                result = 1;
				}
			}
		}
    return result;
}

Такой же примерно  проект (SysTim, GPIO, прерывания от TIMn, UART, ADC, DMA), но на STM32L151xxx работает и дебажится нормально...

Настройки  проектов аналогичны, кроме особенностей камня.

 

SPL и CMSYS пробовал разных релизов подключать, сейчас стоят последние скачанные с ST и Keil...

 

Если кто сталкивался с таким или есть мысли куда рыть, буду благодарен за пинок в нужном направлении...

Впечатление, такое, что  что-то "не включил" в настройках, но чего не хватает не пойму ...

 

Edited by _dark_

Share this post


Link to post
Share on other sites

Кажется сработал принцип "пока объяснял в чем проблема до самого дошло" ))

Пересобрал проект с "чистой" директории, скопировав все исходники, SPL, startup и CMSYS. 

После добавки всего этого в конфигурацию и минимальных настроек самого проекта, все завелось,

после добавления пары инклюдов в свои исходники

 

Вопрос закрыт. 

зы

После пересборки стало выдавать несколько элементарных ошибок,  хотя до этого хотя и чистил проект, но сборка была без них

(с полной перекомпиляцией).

 

Edited by _dark_

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now