victor_pv
Ср 29 апреля 2015 г. 11:56
Всем привет,
Недавно я заметил, что, хотя PIN_MAP объявлен как const, он хранится в RAM.
Поскольку это постоянная, я не понимаю, почему его следует хранить в оперативной памяти, поэтому я, хотя это был компилятор или линкер, связывающийся с ним по какой -то странной причине.
Я попробовал __flash__, но это дает мне сообщение об ошибке, в котором говорится, что оно вызывает конфликт типа с чем -то другим, поэтому я решил немного исследования в этом сообщении об ошибке и после того, как выяснили некоторые сообщения о том, как принуждать данные в определенном разделе, Я решил попытаться объявить это таким образом, заставить его пойти на .Родата, которая является частью Flash:
extern const stm32_pin_info __attribute__ ((раздел (".rodata "))) pin_map [board_nr_gpio_pins] = {
Мое использование барана для того же эскиза прошло с 9 432 до 8 888, использование вспышки сократилось с 15 636 до 16 180, так что я знаю, что это действительно перемещает это на Flash.
Я знаю, что в оригинальной теме было несколько старых постов, пытающихся переместить PIN_MAP в ОЗУ, но я не смог найти вывод к этому.
У меня есть пара вопросов для всех, кто знает:
Есть ли какие -либо проблемы с перемещением PIN_MAP, чтобы вспыхивать?
Поскольку мой Maple Mini мертв (я обнаружил, что 1117 был жареным, поэтому я заменил его, и загрузчик работает, но не наброски, я думаю, что вспышка неисправна), если нет известной проблемы, может кто -то изменить его доску.Файл CPP для объявления PIN_MAP таким образом и посмотрите, работают ли эскизы?
Спасибо.
Недавно я заметил, что, хотя PIN_MAP объявлен как const, он хранится в RAM.
Поскольку это постоянная, я не понимаю, почему его следует хранить в оперативной памяти, поэтому я, хотя это был компилятор или линкер, связывающийся с ним по какой -то странной причине.
Я попробовал __flash__, но это дает мне сообщение об ошибке, в котором говорится, что оно вызывает конфликт типа с чем -то другим, поэтому я решил немного исследования в этом сообщении об ошибке и после того, как выяснили некоторые сообщения о том, как принуждать данные в определенном разделе, Я решил попытаться объявить это таким образом, заставить его пойти на .Родата, которая является частью Flash:
extern const stm32_pin_info __attribute__ ((раздел (".rodata "))) pin_map [board_nr_gpio_pins] = {
Мое использование барана для того же эскиза прошло с 9 432 до 8 888, использование вспышки сократилось с 15 636 до 16 180, так что я знаю, что это действительно перемещает это на Flash.
Я знаю, что в оригинальной теме было несколько старых постов, пытающихся переместить PIN_MAP в ОЗУ, но я не смог найти вывод к этому.
У меня есть пара вопросов для всех, кто знает:
Есть ли какие -либо проблемы с перемещением PIN_MAP, чтобы вспыхивать?
Поскольку мой Maple Mini мертв (я обнаружил, что 1117 был жареным, поэтому я заменил его, и загрузчик работает, но не наброски, я думаю, что вспышка неисправна), если нет известной проблемы, может кто -то изменить его доску.Файл CPP для объявления PIN_MAP таким образом и посмотрите, работают ли эскизы?
Спасибо.
Mrburnette
Ср 29 апреля 2015 13:47
Будет наиболее интересно определить, повлияет ли изменение на производительность. Поскольку серия STM32F является архитектурой Гарварда, вы перемещаете структуру LU с одной шины доступа к данным на другую (Flash и SRAM на разных шинах.) Кроме того, в зависимости от того, как кто -то читает техническую ссылку, может быть до 2 задержек часов, связанных с доступом к вспышке.
Флэш -память
0-24 МГц - Состояние нуля ожидания
24-48 МГц - одно состояние ожидания
48-72 МГц - два состояния ожидания
Буфер предварительного вычинения должен быть включен/выключен только тогда, когда SysClock ниже 24 МГц. Я сделал несколько запросов Google, и я не могу понять, какой сценарий лучше всего: Flash или SRAM.
Луча
Флэш -память
0-24 МГц - Состояние нуля ожидания
24-48 МГц - одно состояние ожидания
48-72 МГц - два состояния ожидания
Буфер предварительного вычинения должен быть включен/выключен только тогда, когда SysClock ниже 24 МГц. Я сделал несколько запросов Google, и я не могу понять, какой сценарий лучше всего: Flash или SRAM.
Луча
victor_pv
Ср 29 апреля 2015 г., 16:15
Я считаю, что первоначальное намерение заключалось в том, чтобы поместить его во вспышке, так как оно было объявлено постоянным, и все другие переменные в этом файле имеют макрос __flash__.
PIN_MAP много используется? Я выполнил быстрый поиск в репо и не видел, как он появлялся слишком часто, я думал, что это можно использовать только при первоначальной настройке периферийного устройства, но я могу ошибаться.
Если кто -то решит проверить его, может помочь запустить интенсивный эскиз в IO, например, один из дисплеев SPI.
РЕДАКТИРОВАТЬ: Я вижу, что он используется для DigitalRead и DigitalWrite. Может быть, стоит проверить, если у кого -то есть что -то интенсивное в Pin io
PIN_MAP много используется? Я выполнил быстрый поиск в репо и не видел, как он появлялся слишком часто, я думал, что это можно использовать только при первоначальной настройке периферийного устройства, но я могу ошибаться.
Если кто -то решит проверить его, может помочь запустить интенсивный эскиз в IO, например, один из дисплеев SPI.
РЕДАКТИРОВАТЬ: Я вижу, что он используется для DigitalRead и DigitalWrite. Может быть, стоит проверить, если у кого -то есть что -то интенсивное в Pin io
Rogerclark
Пт, 01 мая 2015 г., 22:05
Виктор
Я использовал поле в карте штифтов для хранения режима штифта (установленного pinmode ()), он сломает некоторые вещи, если во вспышке
Но я согласен, что это не должно быть в оперативной памяти
Режим штифта, вероятно, можно прочитать обратно с аппаратного обеспечения
Я думаю, что мне нужно было сделать, если для аналога или анализа, как на AVR, вам не нужно устанавливать Pinmode, прежде чем вызовать, но вы это сделали в Libmaple
Поэтому я помещаю код, чтобы проверить Pinmode, когда (я думаю) аналоговая запись вызывается.
Фактически, если мы можем получить карту PIN -кода во Flash, это может решить проблему, когда карта PIN не инициализируется до запуска кода в глобальных конструкторах, E.глин. Следовательно, проблемы с библиотекой OneWire (и другими либерациями)
Редактировать.
Глядя на код, я думаю, я решил, что хранение Pinmode не стоит
Я не могу никому, который использует
см./stm32f1/cores/maple/wirish_types.час
Удалите последний элемент в структуре "Pinmode"
Я использовал поле в карте штифтов для хранения режима штифта (установленного pinmode ()), он сломает некоторые вещи, если во вспышке
Но я согласен, что это не должно быть в оперативной памяти
Режим штифта, вероятно, можно прочитать обратно с аппаратного обеспечения
Я думаю, что мне нужно было сделать, если для аналога или анализа, как на AVR, вам не нужно устанавливать Pinmode, прежде чем вызовать, но вы это сделали в Libmaple
Поэтому я помещаю код, чтобы проверить Pinmode, когда (я думаю) аналоговая запись вызывается.
Фактически, если мы можем получить карту PIN -кода во Flash, это может решить проблему, когда карта PIN не инициализируется до запуска кода в глобальных конструкторах, E.глин. Следовательно, проблемы с библиотекой OneWire (и другими либерациями)
Редактировать.
Глядя на код, я думаю, я решил, что хранение Pinmode не стоит
Я не могу никому, который использует
см./stm32f1/cores/maple/wirish_types.час
Удалите последний элемент в структуре "Pinmode"
typedef struct stm32_pin_info {
gpio_dev *gpio_device; /**< Maple pin's GPIO device */
timer_dev *timer_device; /**< Pin's timer device, if any. */
const adc_dev *adc_device; /**< ADC device, if any. */
uint8 gpio_bit; /**< Pin's GPIO port bit. */
uint8 timer_channel; /**< Timer channel, or 0 if none. */
uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */
uint8 pinMode; /**< mode specific by pinMode call (Roger Clark added to optimize compatibility with Arduino API*/
} stm32_pin_info;
victor_pv
Сб 2 мая 2015 г. 15:37
Роджер,
Я немного смущен, PIN_MAP уже определяется как констант в текущей версии кода, поэтому я не ожидал, что вы изменили какую -либо ее часть во время выполнения.
Код не должен даже компилировать или может сбое, если вы попытаетесь его изменить, верно?
Я вижу, что вы имеете в виду поля в STM32_PIN_INFO, который не определяется как const, но я имел в виду PIN_MAP, который находится в досках.H/Доски.CPP, и в настоящее время определяется как const, поэтому, если не набрать его, код не должен даже компилировать, если вы попытаетесь изменить его, верно?
Это строка, объявляющая это в STM32F1 / Variants / Maple_mini / Poard.CPP:
extern const stm32_pin_info pin_map [board_nr_gpio_pins] = {
Похоже, если бы вы попробовали в какой -то момент, чтобы проверить Pinmode перед аналоговой записи, вы, наконец, вытащили это, так как в настоящее время он просто устанавливает режим для SWM каждый раз, когда вызывается без проверки:
57 void analogwrite (uint8 pin, int duty_cycle8)
58 {
59 Pinmode (PIN -штифт, PWM);
60 Pwmwrite (PIN -код, Duty_cycle8 * 257); // 257 Карты 255 до 65535 (i.E 255*257 = 65535)
61}
Также я не могу найти какую -либо функцию, используя или изменяя это поле Pinmode.
Я попробую позже запустить несколько набросок с удаленным полем и PIN_MAP во Flash, я должен получить мини сегодня из почтового отделения.
Я немного смущен, PIN_MAP уже определяется как констант в текущей версии кода, поэтому я не ожидал, что вы изменили какую -либо ее часть во время выполнения.
Код не должен даже компилировать или может сбое, если вы попытаетесь его изменить, верно?
Я вижу, что вы имеете в виду поля в STM32_PIN_INFO, который не определяется как const, но я имел в виду PIN_MAP, который находится в досках.H/Доски.CPP, и в настоящее время определяется как const, поэтому, если не набрать его, код не должен даже компилировать, если вы попытаетесь изменить его, верно?
Это строка, объявляющая это в STM32F1 / Variants / Maple_mini / Poard.CPP:
extern const stm32_pin_info pin_map [board_nr_gpio_pins] = {
Похоже, если бы вы попробовали в какой -то момент, чтобы проверить Pinmode перед аналоговой записи, вы, наконец, вытащили это, так как в настоящее время он просто устанавливает режим для SWM каждый раз, когда вызывается без проверки:
57 void analogwrite (uint8 pin, int duty_cycle8)
58 {
59 Pinmode (PIN -штифт, PWM);
60 Pwmwrite (PIN -код, Duty_cycle8 * 257); // 257 Карты 255 до 65535 (i.E 255*257 = 65535)
61}
Также я не могу найти какую -либо функцию, используя или изменяя это поле Pinmode.
Я попробую позже запустить несколько набросок с удаленным полем и PIN_MAP во Flash, я должен получить мини сегодня из почтового отделения.
Rogerclark
Сб 2 мая 2015 г., 20:35
Привет, Виктор
Я выведу переменную Pinmode из структуры.
Если нам нужно хранить режим PIN в будущем, чтобы ускорить ситуацию, мы можем поместить его в отдельный массив.
я.эн. Analogwrite будет намного медленнее, чем это должно быть, потому что мы должны вызвать Pinmode для обратной совместимости с платами AVR, которые, похоже, не нужно установить PinMode, чтобы использовать SWM.
Но в STM32 есть дополнительные режимы PIN, когда -то из которых есть PWM.
Я думаю, что это то, что, вероятно, нужно задокументировать, на этом сайте где -то
Возможно, нам нужен новый раздел для специфического программирования STM32.
Где мы можем положить этот материал, а также обсудить DMA, DAC и т. Д
Я выведу переменную Pinmode из структуры.
Если нам нужно хранить режим PIN в будущем, чтобы ускорить ситуацию, мы можем поместить его в отдельный массив.
я.эн. Analogwrite будет намного медленнее, чем это должно быть, потому что мы должны вызвать Pinmode для обратной совместимости с платами AVR, которые, похоже, не нужно установить PinMode, чтобы использовать SWM.
Но в STM32 есть дополнительные режимы PIN, когда -то из которых есть PWM.
Я думаю, что это то, что, вероятно, нужно задокументировать, на этом сайте где -то
Возможно, нам нужен новый раздел для специфического программирования STM32.
Где мы можем положить этот материал, а также обсудить DMA, DAC и т. Д
Mrburnette
Пн, 04 мая 2015 г. 14:21
Я нашел этот пост из старого форума Leaflabs, касающийся распределения SRAM против Flash:
http: // форумы.Leaflabs.com/тема.PHP?ID = 992 Проверить Мболявар ответ.
Луча
http: // форумы.Leaflabs.com/тема.PHP?ID = 992 Проверить Мболявар ответ.
Луча
Rogerclark
Пн, 04 мая 2015 г., 21:07
Луча,
Спасибо за ссылку.
Поскольку все на карте PIN -карты, было бы безопаснее объявить Const, потому что атрибут Flash является директивой линкера, поэтому я был бы немного обеспокоен, если бы использовался только __flash__, что компилятор не знает, что эти значения не могут быть измененный.
Элементы в stm32_info struct, а также все константы, поэтому было бы лучше, если бы они были помечены как отстой, но больше кода необходимо, если мы изменим это, потому что есть несколько функций, которые дают ошибки, если я изменяю члены STM32_Info, чтобы.
Поэтому в качестве первого прохода, если скажем, идите и измените константный материал, так как, вероятно, все еще будет положить в оперативную память, а вторые проходы (когда работает констант) - это добавление директивы Flash Linker
Вероятно, стоит профилировать скорость DigitalWrite до и после изменения, так как он смотрит на вещи на карте PIN
Спасибо за ссылку.
Поскольку все на карте PIN -карты, было бы безопаснее объявить Const, потому что атрибут Flash является директивой линкера, поэтому я был бы немного обеспокоен, если бы использовался только __flash__, что компилятор не знает, что эти значения не могут быть измененный.
Элементы в stm32_info struct, а также все константы, поэтому было бы лучше, если бы они были помечены как отстой, но больше кода необходимо, если мы изменим это, потому что есть несколько функций, которые дают ошибки, если я изменяю члены STM32_Info, чтобы.
Поэтому в качестве первого прохода, если скажем, идите и измените константный материал, так как, вероятно, все еще будет положить в оперативную память, а вторые проходы (когда работает констант) - это добавление директивы Flash Linker
Вероятно, стоит профилировать скорость DigitalWrite до и после изменения, так как он смотрит на вещи на карте PIN
victor_pv
Пн, 04 мая 2015 г., 21:40
Хорошее чтение Рэй. Кроме того, некоторые примечания о скорости позже в той же теме потока, но что касается скорости, я думаю, что мы могли бы получить больше от прямого письма до регистров порта, когда необходима скорость, чем сохранить всю эту таблицу в ОЗУ.
Мне нужно проверить сейчас, когда у меня есть пара бегущих мини.
Мне нужно проверить сейчас, когда у меня есть пара бегущих мини.
Rogerclark
Пн, 04 мая 2015 г., 21:46
Виктор
Спасибо.
Пса. Не уверен, есть ли пример, который облегчит этот тест, но если это так, не могли бы вы проверить, что вещи также работают в прерывании, так как это часто бывает области, которая не работает после того, как мы изменили такие вещи
Пса.
Я уже некоторое время на IRC
http: // webchat.Freenode.сеть/?случайный ... STM32duino
Спасибо.
Пса. Не уверен, есть ли пример, который облегчит этот тест, но если это так, не могли бы вы проверить, что вещи также работают в прерывании, так как это часто бывает области, которая не работает после того, как мы изменили такие вещи
Пса.
Я уже некоторое время на IRC
http: // webchat.Freenode.сеть/?случайный ... STM32duino
victor_pv
Вторник 5 мая 2015 г. 14:36
Роджер,
Я проверял, что происходит с PIN_MAP, здесь некоторые выводы:
Будь то PIN_MAP во флэш -памяти или оперативной памяти, он инициализируется только значениями int, все указатели (GPIO, таймер и АЦП).
Я подтвердил это, независимо от того, заставляю ли я это вспыхивать или нет. Я не знаю, в какой момент PIN_MAP заполняется правильными значениями, я думаю, где -то во время инициализации, но я думаю, что наличие 0 значений - это то, что вызывает другие проблемы, которые вы указали с библиотеками, пытающимися получить доступ к портам IO. Возможно, они получают 00s, а не правильные значения.
На срок есть аналогичная таблица, но имеет правильные значения во флэш -. Он содержит только один указатель, и этот указатель по адресу регистра MCU, а не на стойке, как мы имеем в Libmaple.
Изменение всего этого на константы кажется немного сложнее, чем я думал, и может потребовать редактирования некоторых функций, но я думаю, что это возможно, и я думаю, что это должно решить другие проблемы с PIN_MAP.
Теперь, о том, что в Flash медленнее, PIN_MAP получает доступ к цифровому читанию и записам, но у этих функций тоже много других накладных расходов, поэтому я не уверен тесты.
Я не думаю, что Leaflabs ставят это в оперативную память, но по какой -то причине был компромисс. Установка указателей АЦП как постоянные, но не таймер и GPIO, понятия не имею, почему, за исключением того, что, возможно, они думали о том, чтобы иметь все как постоянное и сохранить рам в какой -то момент, но не завершили эту задачу.
Я проверял, что происходит с PIN_MAP, здесь некоторые выводы:
Будь то PIN_MAP во флэш -памяти или оперативной памяти, он инициализируется только значениями int, все указатели (GPIO, таймер и АЦП).
Я подтвердил это, независимо от того, заставляю ли я это вспыхивать или нет. Я не знаю, в какой момент PIN_MAP заполняется правильными значениями, я думаю, где -то во время инициализации, но я думаю, что наличие 0 значений - это то, что вызывает другие проблемы, которые вы указали с библиотеками, пытающимися получить доступ к портам IO. Возможно, они получают 00s, а не правильные значения.
На срок есть аналогичная таблица, но имеет правильные значения во флэш -. Он содержит только один указатель, и этот указатель по адресу регистра MCU, а не на стойке, как мы имеем в Libmaple.
Изменение всего этого на константы кажется немного сложнее, чем я думал, и может потребовать редактирования некоторых функций, но я думаю, что это возможно, и я думаю, что это должно решить другие проблемы с PIN_MAP.
Теперь, о том, что в Flash медленнее, PIN_MAP получает доступ к цифровому читанию и записам, но у этих функций тоже много других накладных расходов, поэтому я не уверен тесты.
Я не думаю, что Leaflabs ставят это в оперативную память, но по какой -то причине был компромисс. Установка указателей АЦП как постоянные, но не таймер и GPIO, понятия не имею, почему, за исключением того, что, возможно, они думали о том, чтобы иметь все как постоянное и сохранить рам в какой -то момент, но не завершили эту задачу.
Rogerclark
Вторник 5 мая 2015 г., 20:57
Виктор
Спасибо, что посмотрели на это
Я прочитал что -то опубликованное BOBC на днях в списке рассылки разработчиков IDE, в котором предполагалось, что Due имела какую -то форму инициализации, чтобы установить такие вещи.
Кто -то думает, что это можно попробовать, - это добавление еще одного массива во вспышке, но просто положите в него несколько жестко закодированных цифр.
Затем посмотрите, получает ли это данные в вспышке .
Если это так, возможно, мы можем медленно понять, почему карта PIN - нулевой, если она во вспышке
Потеря скорости повторения, если карта штифта в вспышке
Я думаю, что преимущество предварительно инициализированных данных перевешивает любые потери скорости, и, как вы говорите, есть улучшения скорости, которые мы могли бы сделать для функций API E.глин. пинмод
В любом случае
еще раз спасибо
Роджер
Спасибо, что посмотрели на это
Я прочитал что -то опубликованное BOBC на днях в списке рассылки разработчиков IDE, в котором предполагалось, что Due имела какую -то форму инициализации, чтобы установить такие вещи.
Кто -то думает, что это можно попробовать, - это добавление еще одного массива во вспышке, но просто положите в него несколько жестко закодированных цифр.
Затем посмотрите, получает ли это данные в вспышке .
Если это так, возможно, мы можем медленно понять, почему карта PIN - нулевой, если она во вспышке
Потеря скорости повторения, если карта штифта в вспышке
Я думаю, что преимущество предварительно инициализированных данных перевешивает любые потери скорости, и, как вы говорите, есть улучшения скорости, которые мы могли бы сделать для функций API E.глин. пинмод
В любом случае
еще раз спасибо
Роджер
victor_pv
Ср. 6 мая 2015 г., 20:57
Ну, я собираюсь отказаться от PIN_MAP. Я думаю, что это проблема компилятора или линкера.
Я тестировал, и если какая -то из даты в структуре PIN_MAP является указателем на другую константу или переменную, то он не заполняет значение во время компиляции, он оставит его 0.
Если мне это нравится, что есть, что существует указатель на адрес памяти, определенный в линии определения, который правильно там населяет во время компиляции.
Я изменил все указатели на *const и все еще имею эту проблему.
На самом деле я вижу, что Timer1, GPIOA GPIOB и т. Д. Перейдите к адресам флэш -адресов, поэтому компилятор правильно принимает их как константы, но эти адреса не отображаются в PIN_MAP. Я предполагаю, что что -то заполняет эти данные во время выполнения, поэтому, когда я заставляю их вспыхивать, они остаются со значением 0, и ничего не работает.
Я протестировал все это на компьютере только с Maple IDE и CodeSourcery GCC 4.4, я повторяю тест на компьютере с Arduino IDE и GCC 4.8 или даже 4.9, но я также нашел этот старый пост по странным вопросам, также связанным с размещением указателей в структуре в ПЗУ, только я не вижу, как применить его решение к нашему делу:
http: // Stackoverflow.com/Question/4962 ... рука
Я тестировал, и если какая -то из даты в структуре PIN_MAP является указателем на другую константу или переменную, то он не заполняет значение во время компиляции, он оставит его 0.
Если мне это нравится, что есть, что существует указатель на адрес памяти, определенный в линии определения, который правильно там населяет во время компиляции.
Я изменил все указатели на *const и все еще имею эту проблему.
На самом деле я вижу, что Timer1, GPIOA GPIOB и т. Д. Перейдите к адресам флэш -адресов, поэтому компилятор правильно принимает их как константы, но эти адреса не отображаются в PIN_MAP. Я предполагаю, что что -то заполняет эти данные во время выполнения, поэтому, когда я заставляю их вспыхивать, они остаются со значением 0, и ничего не работает.
Я протестировал все это на компьютере только с Maple IDE и CodeSourcery GCC 4.4, я повторяю тест на компьютере с Arduino IDE и GCC 4.8 или даже 4.9, но я также нашел этот старый пост по странным вопросам, также связанным с размещением указателей в структуре в ПЗУ, только я не вижу, как применить его решение к нашему делу:
http: // Stackoverflow.com/Question/4962 ... рука
Rogerclark
Ср. 6 мая 2015 г., 21:14
Виктор
Спасибо, что посмотрели на это
Если это проблема с настройками линкера, это будет немного крутой кривой обучения, для всех нас, я думаю, потому что я посмотрел на сценарии линкеров некоторое время назад, когда мы двигали адрес начала кода для загрузчика 2.0 и сценарии линкеров используют свой собственный язык, который выглядит как ничто, что я встречал раньше ;-(
Я все еще думаю, что стоит сделать второй массив E.глин.
PIN_MAP_FLASH и начните с того, что просто положил в него числа и посмотрите, если это будет помещено в Flash
Кстати. Как вы проверяете, если он вспыхнет или нет?
Сериал все еще работает, когда вы связываетесь с этим материалом ?
Спасибо
Роджер
Спасибо, что посмотрели на это
Если это проблема с настройками линкера, это будет немного крутой кривой обучения, для всех нас, я думаю, потому что я посмотрел на сценарии линкеров некоторое время назад, когда мы двигали адрес начала кода для загрузчика 2.0 и сценарии линкеров используют свой собственный язык, который выглядит как ничто, что я встречал раньше ;-(
Я все еще думаю, что стоит сделать второй массив E.глин.
PIN_MAP_FLASH и начните с того, что просто положил в него числа и посмотрите, если это будет помещено в Flash
Кстати. Как вы проверяете, если он вспыхнет или нет?
Сериал все еще работает, когда вы связываетесь с этим материалом ?
Спасибо
Роджер
Mrburnette
Ср. 06 мая 2015 г., 23:53
Любые подсказки в списке разборки мигания.Ино?
Я сделал разборку с источником, который прикреплен как артефакт.
Код скомпилирован и разобрался:
Я сделал разборку с источником, который прикреплен как артефакт.
Код скомпилирован и разобрался:
/*
Blink: Turns on the built-in LED on for one second, then off for one second, repeatedly.
Arduino 1.7.2 Maple Mini Bootloader 2
Sketch uses 15,276 bytes (12%) of program storage space. Maximum is 122,880 bytes.
Global variables use 4,504 bytes of dynamic memory.
Ported to Maple from the Arduino example 27 May 2011 By Marti Bolivar
*/
#define BOARD_LED_PIN PB1 // Maple Mini board LED pin# 33
#define ONE_SECOND 1000 // 1000 mS
void setup() {
// Set up the built-in LED pin as an output:
pinMode(BOARD_LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(BOARD_LED_PIN,!digitalRead(BOARD_LED_PIN));// Turn the LED from off to on, or on to off
delay(ONE_SECOND); // Wait for 1 second (1000 milliseconds)
}
Rogerclark
Чт, 7 мая 2015 г. 12:04
Луча,
Похоже, есть небольшие кусочки статических данных, но карта штифтов выглядит как набор инструкций по перемещению e.глин. Перемещение данных из ПЗУ в ОЗУ
Похоже, есть небольшие кусочки статических данных, но карта штифтов выглядит как набор инструкций по перемещению e.глин. Перемещение данных из ПЗУ в ОЗУ
Рик Кимбалл
Чт, 7 мая 2015 г., 12:29
objdump -cs будет вносить имена C ++
victor_pv
Чт, 7 мая 2015 г., 12:41
Роджер, я подтвердил, что значения int8 были там правильно, именно указатели на таймер, АЦП и GPIO отсутствовали, хотя сами эти указатели были сохранены во вспышке, поэтому они были в очень статической позиции, но все еще не будут Появиться в PIN_MAP, только 00000000 для этих полей.
Глядя на Libmaple и Due The Due, делает что -то подобное (не реальные ценности, просто идея)
#define gpioa (gpio_dev *const) 0x800000
Они в массиве PIN -.
Вместо этого в Libmaple у нас есть GPIOA для типа gpio_dev, тогда у нас есть указатель gpio_dev *const gpioa = &GPIOA
И pin_map contaions gpioa.
Таким образом, несмотря на то, что сам GPIOA принимал правильное значение во вспышке и указывая на положение оперативной памяти GPIOA, линкер по какой -то глупой причине не поместил бы этот адрес в PIN_MAP.
Я подтвердил, что положил целое число работ, если я помесчу значение, определенное в определении, работает, но если я помесчу указатель на что -то, оно не сработает (я даже создал новые пункты и дал им определенную ценность в гекс, все еще не сработает).
Но... Я нашел решение. Если я заполняю таблицу адресом, который содержит GPIOA (&GPIOA), который работает безупречно.
Теперь GPIOA (в строчных регистрах) был объявлен статичным, поэтому мне пришлось изменить таймер.H, таймер.С, GPIO.H, GPIO.C, ADC.H и ADC.C, чтобы объявить переменные внешние, а не статические.
Я понятия не имею, почему Leaflabs объявили их статичными, учитывая, что в дальнейшем они объявили внешний указатель на каждую из этих статики, чтобы их можно было изменить из любой точки кода, и на самом деле их нужно изменить для управления булавками в любом случае.
Я собрал эскиз мигания и загрузил его, и он работает. Я имею Alse проверить положение PIN_MAP в .Файл карты и проверил файл bin и имеет все правильные значения в нужных местах.
Таким образом, на этом этапе PIN_MAP может быть сохранена ОЗУ, но требует изменения множества различных файлов и создания переменных TimerX, ADCX и GPIOX. Тем не менее они принимали память, и они были доступа через указатели, поэтому я не вижу недостатка в создании, а затем, но если вы думаете иначе, дайте мне знать.
Если есть какой -нибудь хороший пример, чтобы проверить проблему, который у вас был с классами, манипулирующими булавками, дайте мне знать, я не думаю, что помню много подробностей об этом, но может быть связана с тем, что таблица PIN_MAP не была полной до тех пор, пока время выполнения, и теперь оно завершено во время компиляции, поэтому мы можем протестировать.
Я создам новую репо для загрузки измененных файлов, так как я сделал копию в своем жестком состоянии, чтобы не испортить свою рабочую установку (не то чтобы я уже не испортил ее...)
Кроме того, это использование памяти Mlink Sketch с PIN_MAP во Flash, и в RAM (я использую Libstd Nano, в противном случае RAM поднимется до 4xxx):
Sketch использует 13 044 байта (10%) пространства для хранения программы. Максимум составляет 122 880 байт.
Глобальные переменные используют 1872 байта динамической памяти.
Sketch использует 12 744 байта (10%) пространства для хранения программ. Максимум составляет 122 880 байт.
Глобальные переменные используют 2432 байта динамической памяти.
Глядя на Libmaple и Due The Due, делает что -то подобное (не реальные ценности, просто идея)
#define gpioa (gpio_dev *const) 0x800000
Они в массиве PIN -.
Вместо этого в Libmaple у нас есть GPIOA для типа gpio_dev, тогда у нас есть указатель gpio_dev *const gpioa = &GPIOA
И pin_map contaions gpioa.
Таким образом, несмотря на то, что сам GPIOA принимал правильное значение во вспышке и указывая на положение оперативной памяти GPIOA, линкер по какой -то глупой причине не поместил бы этот адрес в PIN_MAP.
Я подтвердил, что положил целое число работ, если я помесчу значение, определенное в определении, работает, но если я помесчу указатель на что -то, оно не сработает (я даже создал новые пункты и дал им определенную ценность в гекс, все еще не сработает).
Но... Я нашел решение. Если я заполняю таблицу адресом, который содержит GPIOA (&GPIOA), который работает безупречно.
Теперь GPIOA (в строчных регистрах) был объявлен статичным, поэтому мне пришлось изменить таймер.H, таймер.С, GPIO.H, GPIO.C, ADC.H и ADC.C, чтобы объявить переменные внешние, а не статические.
Я понятия не имею, почему Leaflabs объявили их статичными, учитывая, что в дальнейшем они объявили внешний указатель на каждую из этих статики, чтобы их можно было изменить из любой точки кода, и на самом деле их нужно изменить для управления булавками в любом случае.
Я собрал эскиз мигания и загрузил его, и он работает. Я имею Alse проверить положение PIN_MAP в .Файл карты и проверил файл bin и имеет все правильные значения в нужных местах.
Таким образом, на этом этапе PIN_MAP может быть сохранена ОЗУ, но требует изменения множества различных файлов и создания переменных TimerX, ADCX и GPIOX. Тем не менее они принимали память, и они были доступа через указатели, поэтому я не вижу недостатка в создании, а затем, но если вы думаете иначе, дайте мне знать.
Если есть какой -нибудь хороший пример, чтобы проверить проблему, который у вас был с классами, манипулирующими булавками, дайте мне знать, я не думаю, что помню много подробностей об этом, но может быть связана с тем, что таблица PIN_MAP не была полной до тех пор, пока время выполнения, и теперь оно завершено во время компиляции, поэтому мы можем протестировать.
Я создам новую репо для загрузки измененных файлов, так как я сделал копию в своем жестком состоянии, чтобы не испортить свою рабочую установку (не то чтобы я уже не испортил ее...)
Кроме того, это использование памяти Mlink Sketch с PIN_MAP во Flash, и в RAM (я использую Libstd Nano, в противном случае RAM поднимется до 4xxx):
Sketch использует 13 044 байта (10%) пространства для хранения программы. Максимум составляет 122 880 байт.
Глобальные переменные используют 1872 байта динамической памяти.
Sketch использует 12 744 байта (10%) пространства для хранения программ. Максимум составляет 122 880 байт.
Глобальные переменные используют 2432 байта динамической памяти.
victor_pv
Чт, 7 мая 2015 г., 12:46
Кстати, нет необходимости разбирать, чтобы увидеть, куда идет PIN_MAP, наши параметры Liker настроены на создание .Карта файл автоматически, который показывает адрес для переменных. я.e Когда pin_map находится в оперативной памяти:
.данные.Pin_map 0x20000068 0x220 C: \ users \ victor \ appdata \ local \ temp \ build9195735699750058409.TMP \ Poard.CPP.о
0x20000068 PIN_MAP
Когда во флэш -флэш:
.Родата.Pin_map
0x08004ea4 0x220 C: \ users \ victor \ appdata \ local \ temp \ build9195735699750058409.TMP \ Poard.CPP.о
0x08004ea4 pin_map
.данные.Pin_map 0x20000068 0x220 C: \ users \ victor \ appdata \ local \ temp \ build9195735699750058409.TMP \ Poard.CPP.о
0x20000068 PIN_MAP
Когда во флэш -флэш:
.Родата.Pin_map
0x08004ea4 0x220 C: \ users \ victor \ appdata \ local \ temp \ build9195735699750058409.TMP \ Poard.CPP.о
0x08004ea4 pin_map
Rogerclark
Чт, 7 мая 2015 г., 1:00
Спасибо, Рик
Можете ли вы прислать мне обновленные файлы или сделать запрос на тягу
Спасибо
Роджер
Можете ли вы прислать мне обновленные файлы или сделать запрос на тягу
Спасибо
Роджер
victor_pv
Чт, 7 мая 2015 г., 2:20
Я все еще в старшей пересмотре репо, с IDE 1.6.0, так что у меня все еще есть светодиод.
Я провел тест на петлю, переключав светодиод в течение 1 миллиона циклов, и с PIN_MAP в оперативной памяти требуется 640 мс, чтобы завершить цикл. С PIN_MAP во флэш -738 мс, так что примерно на 100 мс больше, что приводит к 15% больше времени для завершения этой петли.
Учитывая, что этот цикл только манипуляции с PIN, без каких -либо других накладных расходов, я бы сказал, что у него меньше накладных расходов, чем больше процедур.
Это эскиз для справки:
Я провел тест на петлю, переключав светодиод в течение 1 миллиона циклов, и с PIN_MAP в оперативной памяти требуется 640 мс, чтобы завершить цикл. С PIN_MAP во флэш -738 мс, так что примерно на 100 мс больше, что приводит к 15% больше времени для завершения этой петли.
Учитывая, что этот цикл только манипуляции с PIN, без каких -либо других накладных расходов, я бы сказал, что у него меньше накладных расходов, чем больше процедур.
Это эскиз для справки:
void setup() {
// Set up the built-in LED pin as an output:
pinMode(BOARD_LED_PIN, OUTPUT);
Serial.begin();
delay (5000);
Serial.println("Tests about to start");
}
void loop() {
Serial.println("Starting digitalWrite test");
uint32 t = millis ();
for (uint32 n=1000000; n>0;n--){
toggleLED(); // Turn the LED from off to on, or on to off
}
t = millis()-t;
Serial.print(t);
Serial.println(" ms. for 1.000.000 cycles");
toggleLED(); // Turn the LED from off to on, or on to off
delay(1000); // Wait for 1 second (1000 milliseconds)
}
Rogerclark
Чт, 7 мая 2015 г., 2:38 утра
Виктор
Другим большим преимуществом наличия PIN_MAP в Flash является то, что его решение проблемы PIN_MAP не инициализировано до глобальных конструкторов
Я знаю, что мы можем исправить глобальные конструкторы по -другому, E.глин. Найдите другой способ инициировать PIN_MAP в ОЗУ перед глобальными конструкторами, но это действительно хорошее решение, и я думаю, что было бы легче сказать компилятору его в оперативной памяти, чем это было для его перемещения к ВСПЫШКА
Другим большим преимуществом наличия PIN_MAP в Flash является то, что его решение проблемы PIN_MAP не инициализировано до глобальных конструкторов
Я знаю, что мы можем исправить глобальные конструкторы по -другому, E.глин. Найдите другой способ инициировать PIN_MAP в ОЗУ перед глобальными конструкторами, но это действительно хорошее решение, и я думаю, что было бы легче сказать компилятору его в оперативной памяти, чем это было для его перемещения к ВСПЫШКА
victor_pv
Чт, 7 мая 2015 г., 3:48
Роджер, я только что создал новую репо, чтобы разместить свои модифицированные файлы. Я не хотел отправлять запрос на притяжение в ваше репо, потому что я не синхронизируюсь с вами и не хочу что -то испортить в вашем или моем, поэтому я только что создал новую репо с папкой STM32F1.
Это файлы, которые я должен был редактировать, чтобы он собирал их на флэш. После внесения изменений в указатель в PIN_MAP мне даже не нужно говорить линкеру, чтобы положить его в вспышку с атрибутом или чем -то еще, он сам по себе делает это само по себе
Stm32f1_modified \ cores \ maple \ libmaple \ adc_f1.в
STM32F1_Modified \ System \ Libmaple \ STM32F1 \ Inclate \ Series \ ADC.час
Stm32f1_modified \ cores \ maple \ libmaple \ gpio_f1.в
STM32F1_Modified \ System \ Libmaple \ STM32F1 \ include \ series \ gpio.час
STM32F1_Modified \ cores \ Maple \ libmaple \ timer.в
STM32F1_Modified \ System \ libmaple \ include \ libmaple \ timer.час
STM32F1_Modified \ System \ Libmaple \ STM32F1 \ Inclate \ Series \ Timer.час
Stm32f1_modified \ variants \ maple_mini \ poard.CPP
Модифицированное репо здесь:
https: // github.com/vicopropv/stm32f1_modified/
Было бы неплохо, если бы несколько человек проверяют это и убедитесь, что я больше ничего не сломал.
Возможно, я изменил некоторые другие файлы в процессе, но я почти уверен, что перечисленные выше - единственные необходимые, поэтому вам не нужно загружать все это, если вы не хотите.
Это файлы, которые я должен был редактировать, чтобы он собирал их на флэш. После внесения изменений в указатель в PIN_MAP мне даже не нужно говорить линкеру, чтобы положить его в вспышку с атрибутом или чем -то еще, он сам по себе делает это само по себе
Stm32f1_modified \ cores \ maple \ libmaple \ adc_f1.в
STM32F1_Modified \ System \ Libmaple \ STM32F1 \ Inclate \ Series \ ADC.час
Stm32f1_modified \ cores \ maple \ libmaple \ gpio_f1.в
STM32F1_Modified \ System \ Libmaple \ STM32F1 \ include \ series \ gpio.час
STM32F1_Modified \ cores \ Maple \ libmaple \ timer.в
STM32F1_Modified \ System \ libmaple \ include \ libmaple \ timer.час
STM32F1_Modified \ System \ Libmaple \ STM32F1 \ Inclate \ Series \ Timer.час
Stm32f1_modified \ variants \ maple_mini \ poard.CPP
Модифицированное репо здесь:
https: // github.com/vicopropv/stm32f1_modified/
Было бы неплохо, если бы несколько человек проверяют это и убедитесь, что я больше ничего не сломал.
Возможно, я изменил некоторые другие файлы в процессе, но я почти уверен, что перечисленные выше - единственные необходимые, поэтому вам не нужно загружать все это, если вы не хотите.
Rogerclark
Чт, 7 мая 2015 г., 3:56 утра
Привет, Виктор
Я могу создать ветвь с этим, и люди могут выбрать эту ветвь, если они хотят
Спасибо
Роджер
Я могу создать ветвь с этим, и люди могут выбрать эту ветвь, если они хотят
Спасибо
Роджер
victor_pv
Чт, 7 мая 2015 г., 4:39
Это может быть хорошим решением.
Я все еще загружаю файлы в это измененное репо.
РЕДАКТИРОВАТЬ: Я думаю, что все в порядке. Пока перечисленные выше файлы, это должно быть все, что нужно.
Я все еще загружаю файлы в это измененное репо.
РЕДАКТИРОВАТЬ: Я думаю, что все в порядке. Пока перечисленные выше файлы, это должно быть все, что нужно.
Rogerclark
Чт, 7 мая 2015 г., 7:24 утра
Виктор,
Я вручную скопировал отдельные файлы из этого репо в филиал моего репо
(видеть https: // github.com/rogerclarkmelbourne/ ... P-in-Flash )
Мне пришлось сделать одно незначительное изменение, чтобы.CPP, так как ваш был немного устарел, но другие файлы были в порядке.
Я обновил доску.CPP в Maple Mini, а также в общей серии STM32F103C, так как это, кажется, платы, которые используются большинством людей
Я напишу объявление, и, надеюсь, @ahull, Rick и т. Д. Смолл может проверить их системы Linux, а не то, что оно должно иметь какое -либо значение
GPIO, кажется, работает нормально, а сериал все еще работает
У меня подключена SD -карта, и удивительно, что, кажется, работает ! Я поражен, потому что это никогда не работает в лучшие времена !
В любом случае.
Я также протестирую OneWire через минуту, чтобы увидеть, сможем ли мы использовать общую версию библиотеки (что Пол все еще не поступил на запрос о привлечении !!)
Я вручную скопировал отдельные файлы из этого репо в филиал моего репо
(видеть https: // github.com/rogerclarkmelbourne/ ... P-in-Flash )
Мне пришлось сделать одно незначительное изменение, чтобы.CPP, так как ваш был немного устарел, но другие файлы были в порядке.
Я обновил доску.CPP в Maple Mini, а также в общей серии STM32F103C, так как это, кажется, платы, которые используются большинством людей
Я напишу объявление, и, надеюсь, @ahull, Rick и т. Д. Смолл может проверить их системы Linux, а не то, что оно должно иметь какое -либо значение
GPIO, кажется, работает нормально, а сериал все еще работает
У меня подключена SD -карта, и удивительно, что, кажется, работает ! Я поражен, потому что это никогда не работает в лучшие времена !
В любом случае.
Я также протестирую OneWire через минуту, чтобы увидеть, сможем ли мы использовать общую версию библиотеки (что Пол все еще не поступил на запрос о привлечении !!)
Rogerclark
Чт, 7 мая 2015 г. 8:37 утра
Упс
Похоже, я не делал все вещи в 103c
Похоже, я не делал все вещи в 103c
victor_pv
Чт, 7 мая 2015 г., 13:43
Да, мой репо немного устарел, поэтому я не хотел отправлять запрос на тягу к вашему и в конечном итоге возвращал последние изменения, которые вы внесли.
Мне нужно обновить ваше, но сначала я хочу закончить функциями SPI DMA, поэтому, если что -то не удалось, я знаю, какие изменения я внес.
Как только это будет готово, я обновлю ваш.
Я открою другую ветку о SPI DMA. Приятно иметь разные темы для всего сейчас
РЕДАКТИРОВАТЬ: Есть ли какой -нибудь быстрый набросок, который я могу запустить, чтобы увидеть, работает ли глобальные конструкторы манипуляции?
Мне нужно обновить ваше, но сначала я хочу закончить функциями SPI DMA, поэтому, если что -то не удалось, я знаю, какие изменения я внес.
Как только это будет готово, я обновлю ваш.
Я открою другую ветку о SPI DMA. Приятно иметь разные темы для всего сейчас
РЕДАКТИРОВАТЬ: Есть ли какой -нибудь быстрый набросок, который я могу запустить, чтобы увидеть, работает ли глобальные конструкторы манипуляции?
Rogerclark
Чт, 7 мая 2015 г., 21:33
Просто измените любую библиотеку и добавьте Pinmode в конструктор.
Тем не менее, это не гарантия того, что все работают нормально, потому что это всегда было прерывистой проблемой (см. Материал о неопределенном порядке, в котором глобалы настроены и инициализируются, которые я написал в оригинальном посте)
Тем не менее, это не гарантия того, что все работают нормально, потому что это всегда было прерывистой проблемой (см. Материал о неопределенном порядке, в котором глобалы настроены и инициализируются, которые я написал в оригинальном посте)