Цитата(GetSmart @ Feb 23 2011, 17:03)

Да ладно. Я читал о контроллере прерываний ядра Кортекс-М.
Может быть задействовано 68. Остальные не подключены к периферии, но программно вызываются.
Проверил на железе (STM32F103RB): к сожалению, НЕ вызываются, точнее - вообще не разрешаются прерывания.
В указаном процессоре максимальный номер IRQn = 42 (в отладчике - KEIL - максимальный индекс 42+16=58). Я попробовал разместить вектор как IRQn = 43 (расширил Startup). Код размещается, все путем (почти - ниже расскажу, что странно). Однако при попытке разрешить прерывание (записать соответствующий бит в нужный регистр NVIC_ISERx) бит НЕ хочет устанавливаться, ни программно (ассемблер смотрел), ни напрямую (в окне отображения содержимого памяти в отладчике). То есть, такое впечатление, что само железо затянуло бит на "0", и всё. Соответственно, запись NVIC->STIR = 43 ничего не вызывает. Вот если подготовить и дернуть таким образом IRQn из существующих (< 43), то да, работает. Такие дела...
Теперь о странностях размещения кода.
Например, берем обработчик прерывания от, скажем, USART1. Компилируем, смотрим карту памяти (*.MAP). Видим:
USART1_IRQHandler 0x08000f47 Thumb Code 164 serial.o(.text)Смотрим содержимое таблицы векторов (память под отладчиком, секция RESET, начиная с 0x08000000). По адресу 0x080000D4 (USART1_IRQn = 37, то есть по адресу 0x08000000+4*(37.+ 16.)) и правда видим:
0x080000D4: 47 0F 00 08 ... Идем в текст программы, ставим точку останова на USART1_IRQHandler, запускаем, дожидаемся, когда щелкнет, смотрим и видим...
0x08000F46 B5 10 push {r4, lr}Обратите внимание, что адрес на единицу меньше значения в таблице векторов и карте памяти! Это как? Жук KEIL'а?
Сообщение отредактировал KnightIgor - Feb 24 2011, 09:45