|
|
  |
STM3210X_LD_VL, табличная инициализация периферии |
|
|
|
Jan 26 2013, 18:52
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Golikov A. @ Jan 27 2013, 00:25)  Так может просветите? Как и зачем автор собирается использовать спец функцию которая ухудшает читабельность? Автор предлагает заменить запись REG=VALUE;, которая обычно компилируется в нечто типа Код movw r1, low(REG) movt r1, high(REG) movw r2, low(VALUE) movt r2, high(VALUE) str r2, [r1, #0] на два слова - адрес регистра и значение. Плюс подпрограмма, получающая массив пар регистр-значение, и записывающая значения по адресам. (Я немного упростил) При больших объёмах инициализации это должно дать выигрыш по объёму кода. (Это - цель)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 26 2013, 19:07
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(AHTOXA @ Jan 26 2013, 21:52)  Плюс подпрограмма, получающая массив пар регистр-значение, и записывающая значения по адресам. (Я немного упростил) Мы лицезреем рождение очередной ардуины... Цитата При больших объёмах инициализации это должно дать выигрыш по объёму кода. (Это - цель) В Low Density??? И что в остатке???
|
|
|
|
|
Jan 26 2013, 19:26
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(AHTOXA @ Jan 26 2013, 22:52)  Автор предлагает заменить запись REG=VALUE;, которая обычно компилируется в нечто типа Код movw r1, low(REG) movt r1, high(REG) movw r2, low(VALUE) movt r2, high(VALUE) str r2, [r1, #0] на два слова - адрес регистра и значение. Плюс подпрограмма, получающая массив пар регистр-значение, и записывающая значения по адресам. (Я немного упростил) При больших объёмах инициализации это должно дать выигрыш по объёму кода. (Это - цель) а ну слава богу значит идею я в целом понял верно. Теперь у меня вопрос, какой процент кода занимает инициализация?
|
|
|
|
|
Jan 26 2013, 20:14
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(AHTOXA @ Jan 26 2013, 23:39)  На STM3210X_LD_VL? Очень большой. Периферии куча, а памяти с гулькин нос. Поэтому здесь путь такой - всё, что только возможно, делается аппаратно. Соответственно, инициализация - основная часть программы. На таких чипах обычно кроме инициализации больше почти ничего и не делают  а не получиться ли так что передать 2 слова + место занятое этими 2 словами в функцию записи данных в регистр будет больше чем просто записать данные в регистр пятью командами? поглядел доку на семейство, там самое мелкое значение флешки 64 кБайта, не такая уж у гули маленькая пися  .... Не если конечно подрубать чужие библиотеки не глядя все улетит сразу, но если ручками, то этого дофига... ИМХО
|
|
|
|
|
Jan 26 2013, 20:16
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Golikov A. @ Jan 26 2013, 22:25)  Так может просветите? Как и зачем автор собирается использовать спец функцию которая ухудшает читабельность? Наверное правильнее сказать записывает другими словами те же действия? Попутно узрел еще одну перспективу. Дело в том, что если я на птичьем языке буду описывать действия, относящиеся к инициализации, а их немного, будет проще перейти на переменную длину псевдокоманд, поскольку для него нужна тулза, собирающая коллекцию адресов, данных и масок и формирующая их массив, который не будет более 256 элементов, типа словаря в архивном файле. Естественно, завязываться на Си-синтаксис никто не будет. А так - красота. Кстати, COG кто-нить пользует? Цитата(Golikov A. @ Jan 27 2013, 00:14)  а не получиться ли так что передать 2 слова + место занятое этими 2 словами в функцию записи данных в регистр будет больше чем просто записать данные в регистр пятью командами? Сейчас выигрыш небольшой, скачайте посмотрите. Но я только сегодня этим позанимался.
|
|
|
|
|
Jan 26 2013, 20:23
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Golikov A. @ Jan 27 2013, 02:14)  а не получиться ли так что передать 2 слова + место занятое этими 2 словами Нет, не получится. Потому что передавать надо не два слова, а адрес массива слов. Цитата(_Pasha @ Jan 27 2013, 02:16)  будет проще перейти на переменную длину псевдокоманд А какие проблемы с переменной длиной? Ну вот, навскидку: 0 - команда очистки, 1 параметр(адрес); 1 - команда записи, 2 параметра (адрес, значение); 2 - команда установки битов, 2 параметра (адрес, маска); ... 25 - команда ожидания установки битов, 3 параметра (адрес, маска, тайм-аут); ... команды - как влезет, думаю, что байта за глаза хватит. Выравнивание вот только полетит, но это ничего, мы ж за плотность боремся
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 26 2013, 20:37
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Golikov A. @ Jan 26 2013, 22:14)  а не получиться ли так что передать 2 слова + место занятое этими 2 словами в функцию записи данных в регистр будет больше чем просто записать данные в регистр пятью командами? В функцию эти два слова не передаются сами по себе. Они все записываются в массив структур. Функция берёт массив и выбирате/выполняет. Приблизительно как Код switch(cmd) { case cm_a: cm_a_func(); break; case cm_b: cm_b_func(); break; case cm_c: cm_c_func(); break; case cm_d: cm_d_func(); break; } и Код struct { uint8_t cmd; void (*pfunc)(void); } cmdtable[] = { {cm_a, cm_a_func}, {cm_b, cm_b_func}, {cm_c, cm_c_func}, {cm_d, cm_d_func}, {0, 0} }; плюс функция поиска в массиве по полю cmd с вызовом функции по полю pfunc. На больших таблицах функций выигрыш ощутимый. Либо при большом количестве таких switch() -- функция поиска в таблице-то одна на всех. В данном случае (при 316 байтах в интерпретаторе) выигрыш в коде при тупой записи в регистры пойдёт где-то после 26..27-ой пары, при операциях типа |= где-то после 20-той, при wait-операциях — после 16-той. Надо уменьшать интерпретатор :-) Ради такого дела можно и на асме выписать :-) Цитата(AHTOXA @ Jan 26 2013, 22:23)  0 - команда очистки, 1 параметр(адрес); И ещё команда записи 1-ки (вместе с командой записи 0 полезны для bit-band области). Ну и подэкономить можно на вариации аргумента для записи uint8_t/uint16_t/uint32_t. Только это все интерпретатор утолщает, дольше ждать, когда прибыль пойдёт. Цитата(AHTOXA @ Jan 26 2013, 22:23)  Выравнивание вот только полетит, но это ничего, мы ж за плотность боремся  А у CM0 обращение по невыровненному бывает? А то ведь это имеет смысл для мелких кристаллов.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 26 2013, 20:41
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(AHTOXA @ Jan 27 2013, 00:23)  Ну вот, навскидку: 0 - команда очистки, 1 параметр(адрес); Выравнивание вот только полетит, но это ничего, мы ж за плотность боремся  Очистка как раз используется раз в 100лет Выравнивание при том, что никуда не спешим, значения не имеет. Установка битов, кстати, операции |= &= есть, а ^= еще нету, добавлю. Можно влезть в байт при другой псевдомашине, но уже с регистровой моделью, типа регистры адреса источника, приёмника, непосредственных данных, таймаута, адреса вспомогательной функции. Но сейчас конфигуратор влезает в 304 или 308 байт, а там - уже хз. А с внешней тулзой uint32_t sfr_collection[]={тратата}; и также коллекция масок и прочая. И будут байты при простой машине.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|