реклама на сайте
подробности

 
 
> Настройка прерываний в LPC1778, с полного нуля
ДЕЙЛ
сообщение Jul 7 2014, 19:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Листинг в общих чертах такой:

Инициализация и настройка тактирования

1: U0IER|=0x4; //Разрешение прерывания по приёму байта в RX
2: __enable_irq(); //Разрешаем прерывания (CMSIS)
3: __set_BASEPRI(0xFFFFFFFF); //Разрешаем все прерывания (CMSIS)
4: NVIC_EnableIRQ(UART0_IRQn); //Разрешение прерывания UART0 (CMSIS)

while(1)
{
Циклическая отправка данных на ПК
}


5: __irq void UART0_IRQ1(void)
{
for (k=0; k<200; k++)
{
FIO1SET=0x2000000; //Подёргаем ножкой 200 раз
FIO1CLR=0x2000000;
}
}


Хочу сделать так, чтобы при появлении байта в буфере приёма UART вызывалось прерывание. Вот с этим вызовом прерывания проблема и пока не знаю, с какой стороны к ней подходить. Вопросы такие:
1. Правильно ли я выполнил настройки? (строки 1-4)
в строке 4 в качестве параметра функции передаётся UART0_IRQn. Что значит эта n? Её так и нужно оставлять или вместо n нужно какое-то число стаить? Хотя компилятор ругается.

2. Правильно ли я оформил обработчик прерывания? (строка 5). В этой строке пробовал писать название функции от UART0_IRQ1 ло UART0_IRQ10. Компилятор не ругался, но и толку никакого не было, на осциллографе не видел дёрганий ножки после отправки байта с ПК.
На что влияет выделенное число?


Данные в буфер приёма однозначно приходят правильные с ПК.
На скрине моя программа в сыром виде. При нажатии кнопки "ТЕСТОВАЯ" с COM-порта отправляется 1 байт 0xAA, который я вижу принятым программой от МК (выделено). Т.е. с приёмом нормально всё, но не совсем удобно каждый раз смотреть на буфер, куда удобнее считывать из него байт по прерыванию. Ну и с настройкой прерываний разобраться нужно.

И ещё имеется такой регистр
//SETENA0=0xFFFFFFFF;
В описании написано, что каждый бит этого регистра разрешает или запрещает соответствующее прерывание. Как понять, к какому прерыванию относится конкретный бит?

Сообщение отредактировал ДЕЙЛ - Jul 7 2014, 19:46
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ДЕЙЛ
сообщение Jul 17 2014, 17:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



С уровнями приоритетов разобрался. Ошибка была в том, что я заблуждался относительно предустановки уровней приоритетов. По умолчанию все программируемые прерывания имеют приоритет 0, т.е. самый высокий. Выше только немаскируемые с приоритетами -1 -2 и -3. А у меня получилось, что прерывание от UART0 и от системного таймера имели одинаковый приоритет и поэтому не было вложенности.

Добавил две строки в коде при инициализации:
Код
AIRCR = 0x05FA0200;  //приоритет группы - поле [7:3], субприоритеты отключены, т.к. [2:0] не задействованы
IP1   = 0x800;           //уровень приоритета - 1, биты [2-0] не задействованы.

Остался открытым вопрос по настройке приоритета прерывания системного таймера. Он программируемый, судя по описанию ядра CORTEX-M3, но в даташите пока не откопал ничего по этому поводу. Ещё в описании рекомендуют указывать размер стека. Как он указывается?

Сообщение отредактировал ДЕЙЛ - Jul 17 2014, 17:46
Go to the top of the page
 
+Quote Post
menzoda
сообщение Jul 17 2014, 17:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530



В даташите про него ничего не будет, надо искать в документации на ядро. Насчет размера стека, он указывается в единственном месте - в стартапе (точнее не размер, а границы), и то непонятно зачем, больше не знаю где его можно задать.
Go to the top of the page
 
+Quote Post
ДЕЙЛ
сообщение Jul 18 2014, 03:26
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Цитата(menzoda @ Jul 17 2014, 21:59) *
В даташите про него ничего не будет, надо искать в документации на ядро. Насчет размера стека, он указывается в единственном месте - в стартапе (точнее не размер, а границы), и то непонятно зачем, больше не знаю где его можно задать.

в описании ядра сказано, что при многоуровневой вложенности нужно думать о размере стека, вот и интересуюсь. Какая функция задаёт этот размер?
ПЫСЫ Имел ввиду не даташит, а user manual, т.е. руководство пользователя
Go to the top of the page
 
+Quote Post
menzoda
сообщение Jul 18 2014, 05:07
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530



Никакая. Точнее так, можно сообщить библиотеке времени исполнения (CRT) границы стека, реализоваав _user_initial_stackheap, но имелось в виду не это. Размеры стека не указываются никакой функцией, под стек выделяется отдельная секция (какая - можно посмотреть в startup), размеры этой секции задаются в настроечном файле компоновщика (scatter-файл, *.sct). Проверить, хватает ли текущего размера стека не совсем тривиальная задача, никаких явных сообщений о переполнении стека не будет, нужно выкручиваться самому.

Например, перед началом работы программы заполняем стек одинаковым, по возможности редко встречающимся магическим значением. Запускаем программу и нагружаем ее как можно сильнее. После некоторого времени останавливаем и смотрим на область памяти со стеком: там где магические числа будут затерты - поработала наша программа. Считаем длину оставшейся незатертой части, если осталось совсем мало, или даже совсем не осталось, то лучше увеличить размер стека, иначе можно оставить все как есть.

Можно провести более точные измерения, вставив в каждую функцию код, который будет проверять текущее значение указателя на вершину стека и находить его минимальное значение (так как обычно стек "растет сверху-вниз"), но это слишком сложно.

Третий вариант - прикинуть эмперически, какова максимальная вложенность вызовов может наблюдаться в твоей программе. Например, в фоне крутиться функция Foo, использующая 12 байт стека, которая вызывает функцию Bar, использующую 15 байт стека. Получается, в фоне максимальная вложенность равна двум функцииям, при этом максимальное потребление стека 12 + 15 = 27 байт стека. Но есть еще прерывания: Tar и Gar, потребляющие 30 и 40 байт стека соответственно. Прерывания могут вытеснять друг-друга, а также прерывать фоновую задачу, в итоге имеем максимальную вложенность Foo + Bar + Tar + Gar и максимальное потребление стека 12 + 15 + 30 + 40 = 97 байт. Размер стека выбираем соответствующий, только нужно не забывать, что прерывания используют стек для сохранения текущих значений регистров ЦПУ, и учитывать это в вычислениях потребляемой памяти.

В общем то ARM имел в виду именно это - если у тебя прерывания начинают вытеснять друг-друга, то вложенность вызовов и соответственно потребление стека могут значительно увеличиться.

Сообщение отредактировал menzoda - Jul 18 2014, 05:08
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ДЕЙЛ   Настройка прерываний в LPC1778   Jul 7 2014, 19:43
- - ДЕЙЛ   Сегодня утром вчитался получше в описание регистра...   Jul 8 2014, 05:58
- - menzoda   Цитата(ДЕЙЛ @ Jul 7 2014, 23:43) Правильн...   Jul 8 2014, 08:33
|- - ДЕЙЛ   Цитата(menzoda @ Jul 8 2014, 12:33) Никак...   Jul 8 2014, 11:05
|- - menzoda   Цитата(ДЕЙЛ @ Jul 8 2014, 15:05) как тогд...   Jul 8 2014, 12:50
|- - mempfis_   Цитата(ДЕЙЛ @ Jul 8 2014, 14:05) как тогд...   Jul 8 2014, 14:29
|- - ДЕЙЛ   Цитата(mempfis_ @ Jul 8 2014, 18:29) Вот ...   Jul 8 2014, 20:54
|- - menzoda   Критиковать пока особо нечего, это же просто набро...   Jul 9 2014, 05:43
- - ДЕЙЛ   Прогнал в отладчике через JTAG пошагово. Запусти...   Jul 9 2014, 19:40
|- - menzoda   Все логично. Она застряла в бесконечном цикле обра...   Jul 10 2014, 05:05
|- - ДЕЙЛ   Цитата(menzoda @ Jul 10 2014, 09:05) Эй, ...   Jul 10 2014, 17:58
- - ДЕЙЛ   Вечером попробую. Интересно узнать ещё мнение насч...   Jul 10 2014, 06:36
- - ДЕЙЛ   Продолжаю начинать осваивать LPC. Читаю про вложен...   Jul 15 2014, 19:30
- - menzoda   КодNVIC_EnableIRQ(UART0_IRQn); //Enable IR...   Jul 16 2014, 06:12
|- - ДЕЙЛ   Цитата(menzoda @ Jul 16 2014, 10:12) КодN...   Jul 16 2014, 07:12
|- - menzoda   Цитата(ДЕЙЛ @ Jul 16 2014, 11:12) Данная ...   Jul 16 2014, 11:40
|- - ДЕЙЛ   Цитата(menzoda @ Jul 16 2014, 15:40) Хм, ...   Jul 16 2014, 12:30
- - ДЕЙЛ   На другом форуме сказали посмотреть регистры уровн...   Jul 17 2014, 07:32


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 07:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016