Как мне получить свой awu ISR в таблицу вектора прерывания? [Решено - RTFM!]

Джиммсу
Ср 10 января 2018 г. 20:03
Попытка заставить автоматически проснуться на работу. Я пробовал все, что мог найти, и в конце концов я заставил его работать, но не так, как мне нужно. Короче говоря, я в значительной степени поговорил с регистрами контроллера напрямую. // Tests AutoWakeup so we can use it for power saving mode. #define ledPin PB5 void setup() { pinMode(ledPin, OUTPUT_FAST); digitalWrite(ledPin, HIGH); // Turn off the LED AWU->APR = 62; // Set up to wake up in 0.5 seconds AWU->TBR = 11; } void loop() { digitalWrite(ledPin, LOW); // Turn on the LED delay(1000); digitalWrite(ledPin, HIGH); // Turn off the LED AWU->CSR = 0x10; halt(); digitalWrite(ledPin, HIGH); // Turn off the LED for (;;); // Loop here forever } volatile unsigned char reg; INTERRUPT_HANDLER(AWU_IRQHandler, ITC_IRQ_AWU) { reg = AWU->CSR; // Reading AWU_CSR1 register clears the interrupt flag. }

Пито
Ср 10 января 2018 г., 21:41
Afaik векторная таблица копируется (после сброса) из Flash (область 0x08000000) в SRAM (начиная с 0x200000xx).
Есть scb_base->Vtor reg, который указывает на начало векторной таблицы в SRAM.
Итак, вы можете написать там, что хотите, я думаю.

PS: долгое время назад я устанавливал новое происхождение векторной таблицы, как это //SCB_BASE->VTOR = (volatile uint32_t) 0x2000FC00; *(int volatile*)0xE000ED08 = (volatile uint32_t) 0x2000FC00;

Джиммсу
Чт 11 января 2018 г. 1:04
@Pito, я не уверен, что мы используем ту же аппаратную платформу. У меня нет памяти по этим адресам. Я не могу найти ни одного упоминания о SCB или VTOR. Греп не показывает никаких совпадений во всем пакете.

Mrburnette
Чт 11 января 2018 г., 3:42
Недавнее обсуждение изменения векторной таблицы:
http: // stm32duino.com/viewtopic.PHP?f = 3&T = 1848

Ахулл
Чт 11 января 2018 г., 4:47
[Джиммсу - Чт 11 января 2018 г. 1:04] - @Pito, я не уверен, что мы используем ту же аппаратную платформу. У меня нет памяти по этим адресам. Я не могу найти ни одного упоминания о SCB или VTOR. Греп не показывает никаких совпадений во всем пакете.
@Jimmus - Вы вполне можете быть правильным, какую аппаратную платформу вы используете и какую ядро ​​Arduino вы используете (Maple или ...) ?

Джиммсу
Чт 11 января 2018 г., 5:28 утра
Ой. Извини. Я думал, что публикация в субфоре STM8 укажет, какое оборудование я использую.

Это минимальный совет по разработке системы STM8S003P3P6. Я использую Sduino Core, STM8S103F3 Опция Breakout Board в IDE. Компилятор SDCC.

Дэнниф
Чт 11 января 2018 13:43
Вы задаете два вопроса.

1. Как поместить его в векторную таблицу? Это специфично. Вам придется изучить руководство по компилятору для правильного синтаксиса.

2. Как заставить ваш код работать? Скорее всего, вы работаете, но остальная часть вашего кода не. Я бы сохранил основную петлю в чистоте всех, кроме половины () и перевернул светодиод в ISR.

Эдогальдо
Чт 11 января 2018 г. 14:09
[Джиммсу - Ср 10 января 2018 г. 20:03] - Проблема в том, что после того, как он просыпается, он не выполняет код, который должен был работать.
Вы говорите, что эскиз не запускает бесконечную пустую петлю?
Может ли быть так возобновлено от остановки или чего -то еще (я.эн. Сторожевой плетение) запускает сброс системы?

Джиммсу
Чт 11 января 2018 г., 17:26
@edogaldo Да, я говорю, что эскиз не запускает бесконечную пустую петлю. Или любой из кода сразу после инструкции Halt (). Обратите внимание, что код должен выключить светодиод * с *, а затем введите вечный цикл. Поведение заключается в том, что светодиод включается после 0.5 секунд. Я почти уверен, что он не запускает мой ISR, потому что я поместил там другой код, чтобы проверить, и он не выполнил. Но это тоже не сбрасывается - тогда он снова моргнет светодиодом, как в первый раз. Он просто включает светодиод. А потом больше ничего.

@dannyf Да, я хочу знать, как поместить адрес моего ISR в таблицу векторов прерывания. Я уверен, что остальная часть моего кода работает. Когда я изменяю .HEX -файл с моим редактором и вставьте адрес моего ISR в таблицу векторов прерывания, он отлично работает. Я хочу знать, как заставить компилятора это сделать.

В таблице векторов прерывания есть другие ISRS. В частности, внешние прерывания, и UART TX и RX. Насколько я могу судить, я сделал это так же, как они. Я расстроил все случаи всего, что было связано с вектором, прерыванием или IRQ, и попробовал их все.

Но это действительно хорошее предложение о чтении руководства. Я пойду это прямо сейчас.

Джиммсу
Чт 11 января 2018 г., 17:40
Ну, RTFM! Если у вас есть несколько исходных файлов в вашем проекте, в любом из них могут присутствовать подпрограммы службы прерываний, но прототип ISR должен присутствовать в файле, который содержит функцию «Main». От Main.C:#include // make sure to define prototypes for all used interrupts //#include "stm8s_it.h"

Дэнниф
Чт 11 января 2018 г., 19:05
Снова и снова чтение руководства было наиболее эффективным способом понимания того, как работает компилятор.

Кстати, это требование объявления ISRS в основной.С странно. В моей книге это делает компилятор невозможным.

ZMEMW16
Чт 11 января 2018 г., 20:18
Полностью случайная мысль, в некотором смысле это не является прямой декларацией, так что, возможно, главное.H или это явно заявлено как в основном.в
или это используется намного раньше, чем вы думаете, возможно, код запуска ?
SRP

Джиммсу
Чт 11 января 2018 г., 20:57
Да, это довольно странное требование. Совсем не интуитивно понятно.

@zmemw16 Ну, это то, что в руководстве говорилось: «Прототип ISR должен присутствовать в файле, который содержит функцию« Main »." Основной.C включен <Ардуино.час>, который включал "STM8S_IT.h ", где я в конечном итоге не пострадал от прототипа. Я попытался поместить прототип в основной.c вместо этого, и это работало хорошо.

Еще одна вещь, которая сработала, - это создание моей собственной функции Main () в моем .INO -файл. Мне нужно было прокомментировать все вещи в основном.c, так что это не жаловалось на это, но это сработало.

Дэнниф
Сб 13 января 2018 г. 12:19
Мне не повезло с SDCC. В прошлый раз, когда я попробовал это (несколько лет назад), я не мог заставить его обрезать неиспользованный код. По мере развития своего кода модульно, каждый проект содержит все виды элементов, которые не могут быть использованы для данного проекта. Неспособность вырезать неиспользованный код создает гигантские шестнадцатеричные файлы.

Это понятие необходимости объявлять ваши ISR в основном.C, на мой взгляд, одинаково идиотичен.

IAR или Cosmic - мой выбор на STM8.

Mrburnette
Сб 13 января 2018 г., 3:41
[Джиммсу - Чт 11 января 2018 г. 20:57] - Да, это довольно странное требование. Совсем не интуитивно понятно.

@zmemw16 Ну, это то, что в руководстве говорилось: «Прототип ISR должен присутствовать в файле, который содержит функцию« Main »." Основной.C включен <Ардуино.час>, который включал "STM8S_IT.h ", где я в конечном итоге не пострадал от прототипа. Я попытался поместить прототип в основной.c вместо этого, и это работало хорошо.

Еще одна вещь, которая сработала, - это создание моей собственной функции Main () в моем .INO -файл. Мне нужно было прокомментировать все вещи в основном.c, так что это не жаловалось на это, но это сработало.
Думаю, я обнаружил странность так давно, что теперь я верю, что это интуитивно понятно :ржу не могу:

Именно так работает IDE, что делает это требованием; Arduinoide обычно пытается создать для вас прототипирование... Все файлы в каталоге эскиза Arduino объединяются, а затем этот временный файл отправляется компилятору в качестве одного файла. В своих проектах я обычно помещаю файлы библиотеки в папку Sketch (так что я могу застегнуть все необходимое и сфотографировать версию), чтобы прототипирование (объявление вперед) должно появиться на эскизе.INO перед разделом setup ().

Луча

Джиммсу
Пн 15 января 2018 г., 6:59
Итак, у меня есть вопрос об этом, Рэй. Это было не только в моем .Ино файл, который мне пришлось сделать декларацию. Я уже пробовал это. Мне действительно нужно было найти STM8_IT.H файл и измените это. У меня нет серьезной проблемы с этим, потому что это моя система, и я могу сделать это любым способом, когда я хочу, пока она работает. Это красота открытого исходного кода. Но было бы неплохо, если бы я мог бы как -то разделить вещи и держать их в их хороших маленьких местах и ​​изменить только вещи в моей маленькой ветви структуры каталога. Есть ли в моем каталоге проекта есть файл включения, что Arduino.H включил бы, если бы он был там?

Потому что я вижу немного того, что упомянул Дэнниф о обрезании неиспользованного кода. UART отлично подходит для отладки и определенных видов проектов, но мой маленький отдельный детектор почтового ящика не нуждается в последовательном общении. Платформа AVR автоматически выпускает все это, если вы не используете ее. Я вижу, что в коде STM8 есть некоторые вещи, чтобы сделать то же самое, но у некоторых из них все еще есть проблемы. Например, если я не делаю никаких видов вызовов PinMode () или DigitalWrite (), это экономит меня около 580 байтов программного пространства. Но это все еще ссылается в материалах UART, даже если я никогда не звоню serial_begin () или какие -либо серийные вызовы. Если я просто зайду и где -то #define no_serial, это спасет меня 775 байт программного пространства и 42 байта ОЗУ. Но где общепринятое место для этого? Я делал это в жесткой.H, но опять же, это не тот файл, который я написал, поэтому я бы предпочел сделать это в одном из моих собственных файлов. Как это должно быть сделано?

Я до сих пор не понял, как заставить его не ссылаться во все вещи таймера. Миллис () и микрос (). Даже если я вообще не использую его.

Дэнниф
Вт 16 января 2018 12:06

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

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

Тенбат
Вт 16 января 2018 г. 15:13
[Джиммсу - Пн 15 января 2018 г. 6:59] - Потому что я вижу немного того, что упомянул Дэнниф о обрезании неиспользованного кода. UART отлично подходит для отладки и определенных видов проектов, но мой маленький отдельный детектор почтового ящика не нуждается в последовательном общении. Платформа AVR автоматически выпускает все это, если вы не используете ее. Я вижу, что в коде STM8 есть некоторые вещи, чтобы сделать то же самое, но у некоторых из них все еще есть проблемы. Например, если я не делаю никаких видов вызовов PinMode () или DigitalWrite (), это экономит меня около 580 байтов программного пространства. Но это все еще ссылается в материалах UART, даже если я никогда не звоню serial_begin () или какие -либо серийные вызовы. Если я просто зайду и где -то #define no_serial, это спасет меня 775 байт программного пространства и 42 байта ОЗУ. Но где общепринятое место для этого? Я делал это в жесткой.H, но опять же, это не тот файл, который я написал, поэтому я бы предпочел сделать это в одном из моих собственных файлов. Как это должно быть сделано?
Лучше всего определить опцию компилятора: -dno_serial

Было бы здорово оставить его автоматически, если в источниках нет serial_begin () (). Прямо сейчас этого не происходит, потому что жестко.C - это только один файл, содержащий всю последовательную функцию, включая код инициализации. И линкер SDCC следует за подходом «все или ничего»: он может оставить завершенным .файлы REL, но не отдельные функции. Таким образом, если только одна метка (функция или переменная) ссылается снаружи, весь модуль втягивается.

Вот почему я разделил SPL на множество отдельных функций при компиляции. Что -то подобное было бы возможно для файлов Arduino Core. Код инициализации все еще будет там, но, по крайней мере, остальные, если оставлено.

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

Майкл

Код STM раздут?

[STM32Generic] FSMC - SRAM

HALMX ROADMAP.