угу, причем таких граблей разработчики STM8 набросали кучу. Напр. мин.нарпяжение 2.9В (от таблетки уже не запитать, могли бы и понизить на 0.2..0.3В), отсутствие компаратора, отсутствие входа счета таймера, неудачная разводка портов (разбросаны кусками, а не полные 8 бит) у STM8S103, у 8L101 - отсутствие АЦП, второго входа и выхода компаратора, кварцевого генератора также нет входа счета таймера (был бы отличный чип с такими параметрами).
Как всегда... одни ищут возможности, другие - причины... )))))
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Несколько железный вопрос. Хочу делать первое устройство. Один 8-ми разрядный порт будет шиной данных к ЖКИ графическому дисплею. Но, тот порт который мне подходит для этой цели из соображений удобства разводки содержит пин совмещенный со SWIM интерфейсом. Смогут ли они работать хором или все-же для SWIM надо выбрать контакт, который в схеме совсем не используется? Хотелось бы SWIM использовать не только для программирования кристалла, но и для отладки (а так это первая конструкция - отлаживаться придется долго и хорошо).
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Смогут ли они работать хором или все-же для SWIM надо выбрать контакт, который в схеме совсем не используется? Хотелось бы SWIM использовать не только для программирования кристалла, но и для отладки
Если для отладки - только отдельно Для программирования без отладки - есть положительный опыт совмещения
Недавно взялся за изучение микроконтроллеров STM8. На данный момент читаю документацию (programming manual)
там на странице 14 написано:
Global configuration register (CFG_GCR): The global configuration register is a memory mapped register. It controls the configuration of the processor. It contains the AL control bit: ● AL: Activation level If the AL bit is 0 (main), the IRET will cause the context to be retrieved from stack and the main program will continue after the WFI instruction. If the AL bit is 1 (interrupt only active), the IRET will cause the CPU to go back to WFI/HALT mode without restoring the context. This bit is used to control the low power modes of the MCU. In a very low power application, the MCU spends most of the time in WFI/HALT mode and is woken up (through interrupts) at specific moments in order to execute a specific task. Some of these recurring tasks are short enough to be treated directly in an ISR, rather than going back to the main program. In this case, by programming the AL bit to 1 before going to low power (by executing WFI/HALT instruction), the run time/ISR execution is reduced due to the fact that the register context is not saved/restored each time.
Что я (с помощью переводчика) перевел как: Глобальный регистр конфигурации. Расположен в памяти программ. Управляет конфигурацией процессора. Состоит из бита AL. Когда AL = 0 (основные), возврат из прерывания контекст восстанавливает из стека и продолжает выполнение программы после инструкции WFI.
Когда AL = 1, (только активные прерывания) после команды IRET ЦПУ идет обратно WFI/HALT режим через сохранение контекста.
Этот бит используется для режима энергосбережения ЦПУ. Для очень малопотребляющих приложений, в этом случае MCU проводит большую часть времени в способе WFI/HALT и пробуждается (через перерывы) в определенные моменты, чтобы выполнить определенную задачу. Некоторые из этих возвращающихся задач достаточно короткий, чтобы рассматриваться непосредственно в ISR, вместо того, чтобы возвратиться к главной программе. В этом случае, программируя AL = 1, контекст не будет восстанавливаться, и как следствие, длительность обработчика уменьшится.
В связи с этим вопросы: 1) Для чего используется этот бит (из перевода это не очень ясно)? 2) Что такое ISR? 3) Чем отличается сохранение контекста при AL = 0/1? 4) Связано ли это (и как) с приоритетом прерываний?
_________________ на любой элемент найдется мощность, которая его сожжет.
ISR - Interrupt Service Routine, обработчик прерываний.
AL = 0: Программа доходит до WFI, сохраняет контекст и засыпает. Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET. По ней восстанавливается контекст и управление передётся в точку после команды WFI. Процессор по флагу из прерывания смотрит: - если надо что-то делать, то делает - если надо продолжать спать, то сразу делает переход назад на команду WFI, которая опять сохраняет контекст и загоняет процесоср в сон
AL = 1: Программа доходит до WFI, сохраняет контекст и засыпает. Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET. По IRET процессор сразу засыпает без восстановления контекста и возврата в точку после команды WFI.
Т.е. вместо установки флагов для анализа «наверху» при необходиости что-то обработать выше обработчк сбрасывает AL и IRET возвращает в основную программу. Если же делать больше нечего (прерывание не обнаружило ничего достойного внимания), то AL остаётся поднятым и процессор сразу засыпает. Экономия активного времени -- восстановление контекста + то время, которое «верхний» уровень потратил бы на анализ флага + сохранение контекста
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Спасибо. Тогда еще один вопрос: В то же документе на стр. 50 Зачем нужны Pre-code и pre-bytes? pre-byte это байт который стоит перед кодом операции и изменяет команду, которая следуют за ним.
Вот например один из них: 90h = PDY Replaces an X based instruction using immediate, direct, indexed or inherent addressing mode by a Y one. It also provides read/modify/write instructions using Y indexed addressing mode with long offset and two bit handling instructions (BCPL and BCCM)
и мой перевод, из которого яснее не становится: Заменяет команду, основанную на Х использованием непосредственный, прямой, индексной или inherent адресации основанной на Y . Это также обеспечивает работу команд типа чтение/модификация/запись, с использованием индексной адресации с регистром Y адресации с длинным смещением и двумя "ручными» битовыми командами (BCPL и BCCM).
_________________ на любой элемент найдется мощность, которая его сожжет.
Надеюсь, прямо в кодах программировать не собираетесь? Тогда просто запомните, что любая команда с регистром Y длиннее на один байт, чем команда с регистром X и по мере возможность следует использовать регистр X (это не всегда так, в самом конце я про это добавил, но в первом приближении можно таким правилом пользоваться).
Префиксы меняют поведение следующей команды. Грубо говоря, где-то есть триггер, который обычно сброшен (и сбрасывается после каждой команды). Когда в нём 0, то используется регистр X. Пишем команду
Код:
ldw X,#$1234
для загрузки константы в X. Будет сгенерирован код
Код:
0xAE 0x12 0x34
Теперь пишем команду
Код:
ldw Y,#$1234
для загрузки константы в Y. Код
Код:
0x90 0xAE 0x12 0x34
Префикс 0x90 взводит тот триггер и он переключает дешифратор, который теперь обеспечивает работу следующей команды (видом 1:1 как для загрузки X) с регистром Y. Сразу после выполнения триггер сбрасывается и последовательнсть
Код:
0x90 0xAE 0x12 0x34 0xAE 0x56 0x78
занесёт первой строкой 0x1234 в Y и второй строкой 0x5678 в X. 0xAE - код операции занесения 16-битной константы в индексный регистр (по умолчанию X) 0x90 - префикс смены индексного регистра с X на Y История тянется издавна и корни STM8 в ST7 и в мотороловских 8-битниках MC68xx и MOS Technology (Commodore) 6502. Среди них были и такие, у которых был только один индексный регистр. И такие, у которых короткая адресация была не к младшим 256 байтам ОЗУ, а к странице, старшие 8 бит адреса которой хранились в региcтре DP (DirectPage). Кстати, удобно было бы для RTOS -- при переключении задач сохранять/восстанавливать не кусок области короткой адресации, а только этот регистр. Правда, для этого нужно много ОЗУ, чтобы каждой задаче выделить по странице. И такие, у которых два аккумулятора A и B, которые вкупе могут работать как 16-битный аккумулятор. Короче, перед нами процесор с длинной и неплохой родословной
Также там есть префиксы для косвенности адресации, т.е. обычно команда берёт данные оттуда-то (например, из ячейки памяти), а если перед ней стоит соответствующий префикс, то тогда она из ячейки памяти содержимое вынимет, но использует его не как данные, а как адрес данных.
Код:
0xСE 0x12 0x34 0x72 0xСE 0x12 0x34
Первая команда LDW X, $1234 -- загружаем в X содержимое ячейки памяти с адресом 0x1234 Вторая команда LDW X,[$1234.w] -- загружаем в X содержимое ячейки памяти, адрес которой лежит в ячейке с адресом 0x1234
Сделано это для того, чтобы для довольно редко используемых команд не тратить место в основном коде команды. Например, пришлось бы всегда в коде команды иметь бит для выбора X/Y и для выбора дополнительной косвенности -- вот уже два бита и пропало. Итого в один байт влезет меньше команд.
Если порыться, то там есть и команды, которые имеют одинаковую длину и для X, и для Y. Но там и так префикс есть для дополнительного уровня косвенности и для выбоора длины адреса той ячейки, в которой лежит адрес, а под выбор X/Y таки бит задействован. Но эти знания уже на втором этапе работы с STM8 на ассемблере может понадобитсья, когда уже на высокий уровнеь оптимизации выходить. Поскольку я этого делать не собираюсь, я детально и не смотрел.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
95 uint8_t hi = TIM3_CNTRH; \ uint32_t TProfiler<(uint_fast8_t)'\000'>::time_interval() \ _ZN9TProfilerILh0EE13time_intervalEv: \ 000000 C65328 LD A, L:0x5328 96 uint16_t ticks = (hi << 8) + TIM3_CNTRL; \ 000003 5F CLRW X \ 000004 97 LD XL, A \ 000005 58 SLLW X \ 000006 58 SLLW X \ 000007 58 SLLW X \ 000008 58 SLLW X \ 000009 58 SLLW X \ 00000A 58 SLLW X \ 00000B 58 SLLW X \ 00000C 58 SLLW X \ 00000D C65329 LD A, L:0x5329 \ 000010 905F CLRW Y \ 000012 9097 LD YL, A \ 000014 90BF00 LDW S:?w0, Y \ 000017 72BB0000 ADDW X, S:?w0
тогда как нормальному ковбою хватило бы
Код:
ld A, L:TIM3_CNTRH ld XL, A ld A, L:TIM3_CNTRL rlwa X
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Ну вот, тема на кучу страниц, а ответить некому. Ещё перл от IAR
Код:
uint8_t uu; ... ++uu;
IAR/STM8 1.20
Код:
ld A, #1 ; 2 байта add A, L:uu ; 3 байта ld L:uu, A ; 3 байта
IAR/STM8 1.30
Код:
ld A, L:uu ; 3 байта inc A ; 1 байт ld L:uu, A ; 3 байта
При том, что можно
Код:
inc L:uu ; 4 байта
Тут в теме упоминались другие компиляторы, пожалуйста, покажите их код для такой простой операци и для того, что в предыдущем сообщении. Мне тесно во времени качать/править пробовать все. И так для всех делаю, а не для себя (хотя, возможно, после этого и я с STM8 начну работать, понравились ). Я ж не сам себе IAR выбрал, меня попросили под него кое-что для STM8 сделать. Может, ещё не поздно переагитировать
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Правда надо проверить действительно ли старший байт идет первым, но судя по адресам H и L TIM3_CNTR должно быть правильно. Zheleznjakov, у тебя переменная локальная - на стеке, у задавшего вопрос - глобальная. А с локальной мой вариант с дефайнами выдает:
Использование ИЛИ вместо сложения как минимум уберет условный переход и формирование переноса. Вообще в данном случае использование сложения незачем. А вот это вообще непонятно:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения