Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2020, 20:42

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 20:16 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
Функция задержки с использованием SysTick. SysTick настроен тикать каждую миллисекунду. Обработчик его прерывания инкрементит глобальную переменную. При вызове функции задержки из обработчика внешнего прерывания, систик перестат тикать, и как следствие функция задержки входит в бесконечный луп... все виснет. Почему встает систик?

Код:

void SysTick_Handler(void)
{
systick_ms++;
}

uint32_t uint32_time_diff(uint32_t now, uint32_t before)
{
return (now >= before) ? (now - before) : (UINT32_MAX - before + now);
}

void delay_microseconds(uint16_t us)
{
SysTick->VAL = SysTick->LOAD;
const uint32_t systick_ms_start = systick_ms;

while (1)
{
uint32_t diff = uint32_time_diff(systick_ms, systick_ms_start);

if (diff >= ((uint32_t)us / 1000) + (us % 1000 ? 1 : 0))
break;
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 20:40 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4922
Откуда: Усинск, республика Коми
А так и надо, чтобы константу systick_ms_start объявить в функции, а потом она нигде в этой функции не использовать? Какой смысл?

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 20:47 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5893
Откуда: Москва/Саратов
Может приоритет того прерывания выше чем у систика.

Кстати, что это?
us % 1000 ? 1 : 0

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 20:53 
Старожил

Зарегистрирован: 28 янв 2012, 21:27
Сообщения: 309
Откуда: Питер
dcoder писал(а):
Кстати, что это?
us % 1000 ? 1 : 0

Если остаток от деления us на 1000 == 0, то возвращаем "1", иначе "0"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 20:59 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
не, NVIC я настроил - проверил. Всех в группу 0, приоритет у exti 0xF, у систика 0....

а это:
us % 1000 ? 1 : 0

попробуй сразу догадайся называется.. код не мой, стырен с робокрафта)) функция называется delay_microseconds и параметр, судя по названию, принимает в микросекундах. Но тикалка запущена на миллисекунды, и тут к ним и приведено видимо... с поправкой на остаток. Но суть не в этом..

останавливается систик, хоть тресни. Как тока вызвана фунция - все, systick_ms_start = systick_ms всегда. Задержка на таймере работает, но таймер жалко тратить..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 21:42 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
BigLeha писал(а):
А так и надо, чтобы константу systick_ms_start объявить в функции, а потом она нигде в этой функции не использовать? Какой смысл?


мм... она параметром передается в функцию uint32_time_diff(). Посмотрите внимательнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 21:46 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4922
Откуда: Усинск, республика Коми
Timuss писал(а):
останавливается систик, хоть тресни. Как тока вызвана фунция - все, systick_ms_start = systick_ms всегда. Задержка на таймере работает, но таймер жалко тратить..

повторюсь
BigLeha писал(а):
А так и надо, чтобы константу systick_ms_start объявить в функции, а потом она нигде в этой функции не использовать? Какой смысл?

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 23:16 
Старожил
Аватара пользователя

Зарегистрирован: 01 фев 2010, 18:05
Сообщения: 422
BigLeha писал(а):
А так и надо, чтобы константу systick_ms_start объявить в функции, а потом она нигде в этой функции не использовать? Какой смысл?


[телепатия]
похоже смысл в том, что в systick_ms_start сохраняется значение таймера при входе в функцию, а в systick_ms оно будет менятся с приходом прерывания. но преравания нет и прога виснет.
[/телепатия]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 15 июл 2012, 23:33 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
Телепатия верна... хотя все это видно из кода и описания)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 16 июл 2012, 09:59 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4922
Откуда: Усинск, республика Коми
как оно будет сохраняться, если при выходе из процедуры значение стирается? яж потому и спросил, что область видимости переменных нито не отменял, и переменные, объявленные внутри функции не видны за ее пределами...

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 16 июл 2012, 12:14 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
А вне функции она нам и не нужна.... Я проверил, сделав переменную глобальной.... те же яйца - вид сбоку)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 17 июл 2012, 00:42 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1157
Откуда: Brussels
systick_ms как описан?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 17 июл 2012, 12:26 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
volatile uint32_t systick_ms = 0;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 17 июл 2012, 14:36 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1157
Откуда: Brussels
Хм...
Кстати, а эта функция работает если ее вызвать не из хендлера внешнего прерывания? Если да, то, наверное, все же еще раз проверять NVIC...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 17 июл 2012, 15:23 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
//Mt писал(а):
Хм...
Кстати, а эта функция работает если ее вызвать не из хендлера внешнего прерывания? Если да, то, наверное, все же еще раз проверять NVIC...


)) нет! Я это проверил уже... НЕ РАБОТАЕТ! Из main() вызываю и привет! Я что-то вообще ничего не понимаю.. эта функция используется в библиотеке для HD44780, для формирования задержек ногодрыга. И библиотека реально работает, на дисплей все выводит как надо. Стало быть и функция задержки работает?

В остальном коде, до того как я заюзал дисплей, у меня использовалась задержка на переферийном таймере. Ну я и подумал - фигле 2 функции то пользовать, оставлю одну - на систике.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 17 июл 2012, 18:02 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1157
Откуда: Brussels
SysTick_Config(SystemCoreClock / 1000) где-то сделан?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 01:05 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
Да, конечно.... в мейне, сразу после инициализации RCC и SystemCoreClockUpdate(). В SysTick_Config() задается и приоритет систиковского прерывания - наименьший. Его я переопределяю в инициализации NVIC


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 02:42 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1157
Откуда: Brussels
Нездоровая фигня.. может у кого-нибудь еще будет здравая идея ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 13:10 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Может я не прав, но - не нравится мне данное определение :
const uint32_t systick_ms_start = systick_ms;

имхо - компилятор его заменит на 0 при стадии компиляции, так как константа инициализируется величиной равной нулю.

не было бы более рассово правильным - такое определение:
uint32_t systick_ms_start = 0;
systick_ms_start = systick_ms;

Иначе придется возится со ссылками, но они не дадут константу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 15:01 
Только пришел

Зарегистрирован: 23 апр 2012, 17:19
Сообщения: 27
да делал я так, выше писал... глобальную переменную. Виснет...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 18:36 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1157
Откуда: Brussels
Может стоить попробовать выводить debug output внутри цикла и внутри if (запустив функцию из main)?
Ну и посмотреть не испорчен ли SysTick->LOAD - но это уже бред какой-то...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 19:43 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Я говорил не о глобальности переменной! а о том что вы обьявляете ее КОНСТАНТОЙ, причем приравниваете к величине на этапе компиляции : равной нулю!
Насколько я понимаю - она является просто хранилищем количества тиков на момент вызова процедуры поэтому и посоветовал на входе в процедуру поставить systick_ms_start = systick_ms; в виде отдельной строки ( отдельного оператора).

Можно кстати получить ваш скомпилированный файл (.out или .hex) для проверки кода который компилируется для этой функции ?
Потому как выкрутасы оптимизатора кода при компиляции - та еще песня( кстати какой ключ оптимизации используется?).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 19:46 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4922
Откуда: Усинск, республика Коми
balu_dark писал(а):
Я говорил не о глобальности переменной! а о том что вы обьявляете ее КОНСТАНТОЙ, причем приравниваете к величине на этапе компиляции : равной нулю!

Да я уже говорил об этом, только автору топика пофигу на это замечание...

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 18 июл 2012, 20:03 
Старожил

Зарегистрирован: 05 фев 2011, 15:20
Сообщения: 284
Откуда: Хабаровск
balu_dark писал(а):
вы обьявляете ее КОНСТАНТОЙ, причем приравниваете к величине на этапе компиляции
Ерунда. Модификатор const говорит лишь о том, что значение переменной не должно изменяться после инициализации. Но он не отменяет инициализацию, которая для локальной переменной будет выполняться каждый раз при ее создании.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останавливается SysTick
СообщениеДобавлено: 19 июл 2012, 01:59 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Инициализация переменных(констант) будет происходить при запуске скомпилированной программы, а не при каждом входе в процедуру(во всяком случае при определенных условиях - так точно). Так собственно устроены современные компиляторы , особенно если включена оптимизация и линкер видет что первоначальное значение - равно нулю. Он не может догадаться за человека что он подумал рисуя код. он следует строгим правилам.

Собственно о чем мы спорим - все сомнения развеет кусочек дизассемблера откомпилированного кода.

Порылся в гугле :
Цитата:
const int Constant1=96;
will create an integer constant, unimaginatively called ‘Constant1’, with the value 96.

Such constants are useful for parameters which are used in the program but are do not need to be changed after the program is compiled. It has an advantage for programmers over the C preprocessor ‘#define’ command in that it is understood & used by the compiler itself, not just substituted into the program text by the preprocessor before reaching the main compiler, so error messages are much more helpful.

Выделено мной. желающие могут сами перевести. А автор топика задумывал переменную как хранилище временной величины на начало работы подпрограммы. И то что он хочет нбольшая вероятность получить только используя ссылки и разименование но никак не присвоение константе.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB