Разбирался на днях с отладочной платой STM8S-Discovery, да потер всю память на чипе, не запомнив дефолтные значения option bytes. Часть демок теперь не работает как надо. Пол дня прокопался, но так и не разобрался, что там изначально было. Если у кого есть данная плата, напишите пожалуйста, что у вас в ней прошито в option bytes?
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
PombI4, а если прошить значениями по умолчанию (factory default) из даташит?
Добавлено after 2 hours 17 minutes 36 seconds: Как то я это пропустил. 15 апреля вышел SDCC 3.9 SDCC 3.9.0 Feature List: Support for struct / union assignment. Optimizations in the stm8 backend relevant to soft float increase Whetstone score by two thirds. Improvements in rematerialization in the stm8 backend improve code generation for struct, union and arrays. New stack allocator reduces stack space usage for the stm8, z80, z180, gbz80, r2k, r3ka, tlcs90 backends. New ez80_z80 backend for eZ80 in Z80 mode. Removed deprecated sdcclib utility. New pdk14 backend for Padauk µC with 14-bit wide program memory. New in-development pdk15 backend for Padauk µC with 15-bit wide program memory.
Особенно радует ускорение теста Whetstone в два раза и рематериализация для STM8 при операциях со структурами, объединениями и массивами. Код, который SDCC генерил до этого, особенно со структурами, меня сильно раздражал. Присваивание структур и объединений вещь приятная, но мне не в лом было и memcpy() писать. Что там улучшили в аллоцировании стека я пока не понял. Развитие поддержки сверхдешевых, но однократно программируемых, Padauk радует, но это уже к STM8 отношения не имеет.
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
PombI4, Они не могли быть нулевыми. Большинство option bytes у STM8 парные - прямое и инверсное значение. Например, по-умолчанию, OPT1=0х00, а следующий за ним NOPT1=0хFF Поэтому просто нулями их так просто не перепишешь. Подозреваю, что ST VD увидев несоответствие между прямыми и инверсными значениями сам прописал значения по-умолчанию.
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
PombI4, про прошивальщик я не в курсе, к сожалению. Прошивки не блокирую, а остальное удобней устанавливать в коде, так как это может зависеть от параметров сборки.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Доброго времени суток. В RM016 указано, что 16 битный регистр TIM1_CNTR имеет теневой регистр для чтения и не имеет для записи. ARR имеет теневой для записи, про чтение вроде как ничего не сказано. И ничего больше я не нашел.
Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
VladislavS писал(а):
На странице 167.
Спасибо. Вечно сам себе трудности нахожу, чтобы их мужественно преодолевать.
VladislavS писал(а):
Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
Попробовал предложенных оба варианта. Компиллится в кучу команд в том числе логики и сдвига. IAR, оптимизация максимум в режиме speed. В моем варианте переменная capch загружается в 4 команды через аккумулятор.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.
Интересный момент, вот это
Код:
TIM2_CCR3L++;
с компиллилось в это
Код:
TIM2_CCR3L++; 0085A5 C65316 LD A, TIM2_CCR3L 0085A8 4C INC A 0085A9 C75316 LD TIM2_CCR3L, A
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен.
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.
Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
jcxz писал(а):
можно считать что он просто бесплатен.
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее. Тем более система команд STM8 заточена под Си, да и ИАРовцы умеют же, видимо не приоритет просто. А то что демо версия подошла под радиолюбительские хотелки, это частный счастливый случай .
Хрен с ним, придется сильнее напрягать межушный оптимизатор .
Добавлено after 1 minute 23 seconds:
jcxz писал(а):
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
И что? Что это меняет? Проверять пока не хочу, но стоит.
Добавлено after 21 minute 20 seconds:
jcxz писал(а):
Вы используете какую-то древнюю версию IAR.
3.10.4 У меня.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.
Да ладно, инлайнит только в путь даже если не просить об этом.
int main() { uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
foo(capch);
for(;;); }
// --- Листинг ----
//int main() //{ // uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L; / foo(capch); main: LD A, L:0x5315 CLRW X LD XL, A CLR A RLWA X, A LD A, L:0x5316 LD S:?b1, A RRWA X, A OR A, S:?b1 RRWA X, A RRWA X, A JREQ L:??main_0 RIM JRA L:??main_1 ??main_0: SIM // for(;;); ??main_1: JRA L:??main_1 //}
На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения