Наглядность важная вещь, но не абсолютная. Комментарии в этом важнее
Программирование STM8
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
Если говорить про оптимальность той или иной конструкции в Си обективный критерий только один - эфыективность полученоого машинного кода. Оптимизация влияет на это прямым образом
Наглядность важная вещь, но не абсолютная. Комментарии в этом важнее
Наглядность важная вещь, но не абсолютная. Комментарии в этом важнее
- Реклама
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Нет, столь тщательно я свои действия не документирую, чтобы сейчас же назвать точные цифры. По ходу написания мне достаточно быстрого сравнения разных реализаций одного и того же, чтобы принять решение, какую лучше использовать. Оптимизация так же может выполняться по разным критериям. В моем случае -- это скорость, т.к. запас по объему флеша есть, а скорость величина критичная.
Насчет "передача дольше", у меня трансфер по i2c выполняется с использованием слипа, т.е. загрузили данные в регистр, стартовали передачу и спать. Окончание передачи будит ядро. Запустили чтение и опять спать, пока весь байт не приползет. А вот дальше надо все делать максимально быстро, т.к. в это время энергопотребление максимально и в моем случае -- это самый важный ресурс, который надлежит оптимизировать.
Насчет "передача дольше", у меня трансфер по i2c выполняется с использованием слипа, т.е. загрузили данные в регистр, стартовали передачу и спать. Окончание передачи будит ядро. Запустили чтение и опять спать, пока весь байт не приползет. А вот дальше надо все делать максимально быстро, т.к. в это время энергопотребление максимально и в моем случае -- это самый важный ресурс, который надлежит оптимизировать.
Боюсь тут не всё однозначно в плане потребления. Максимально быстро не всегда означает максимально экономично в энергетическом плане. Статическое потребление контроллером не зависит от скорости выполнения, но и оно довольно небольшое. Количество энергии потраченное на обработку данных будет зависеть исключительно от количества переключений и не всегда это коррелирует с количеством тактов, особенно когда задействованы разные инструкции.
Кстати, а как по энергетике будет отражаться вход/выход из спящего режима? Это может убить всю экономию...
Кстати, а как по энергетике будет отражаться вход/выход из спящего режима? Это может убить всю экономию...
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Выход из режима sleep для F030 по времени занимает четыре такта. Именно столько времени проходит с того момента, как случился ивент, до начала исполнения инструкции, следующей после WFE. Других никаких накладных расходов нет.
Говорить о том, что какие-то инструкции более энергоэффективны, а какие-то менее, не имеет смысла до того момента, пока дело не касается какой-то конкретной последовательности машинных команд. Однако, расходы связанные с неизменными энергозатратами по выполнению единичной команды, позволяют утверждать, что чем этих команд меньше, тем для энергоэффективности лучше. Правило, чем меньше команд, тем меньше затраты энергии, будет работать во многих, если не в большинстве, случаев. По любому, разница между энергоэффективностью разных команд намного меньше, чем разница между активным состоянием и режимом сна. Чем раньше уйдем в сон, тем больше сэкономим энергии.
Говорить о том, что какие-то инструкции более энергоэффективны, а какие-то менее, не имеет смысла до того момента, пока дело не касается какой-то конкретной последовательности машинных команд. Однако, расходы связанные с неизменными энергозатратами по выполнению единичной команды, позволяют утверждать, что чем этих команд меньше, тем для энергоэффективности лучше. Правило, чем меньше команд, тем меньше затраты энергии, будет работать во многих, если не в большинстве, случаев. По любому, разница между энергоэффективностью разных команд намного меньше, чем разница между активным состоянием и режимом сна. Чем раньше уйдем в сон, тем больше сэкономим энергии.
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
что я делаю не так?
настроил UART1 на STM8S003F3
настроил RX с прерыванием:
нарисовал обработчик по вектору:
когда прилетают данные, обработчик срабатывает, но начинает срабатывать бесконечно, работает бесконца, хотя на входе всего 22 байта
если точку останова из обработчика убираю и иду программу пошагово то как только прилетает первый байт - у меня отладка зависает, т.е. уходит в исполнение последней строки кода main на которой нажал F10 и больше не возвращается. Не важно какая строка кода, ависает именно с прилетом первого байта
настроил UART1 на STM8S003F3
настроил RX с прерыванием:
Спойлер
Код: Выделить всё
void uart1_init(uint16_t uart1_div){
// GPIO
PD_DDR_bit.DDR5 = 1; //TX for output
PD_DDR_bit.DDR6 = 0; //RX for input
PD_CR1_bit.C16 = 0; // floating RX
PD_CR2_bit.C26 = 0; // no external interrupts for RX
// baud rate registers
UART1_BRR2 = (uart1_div & 0x000f) | (uart1_div >> 12);
UART1_BRR1 = (uart1_div >> 4) & 0x00ff;
UART1_CR1_PIEN = 0; // no parity
UART1_CR1_PCEN = 0; // no parity control
UART1_CR1_M = 0; // 8 bit
UART1_CR1_UART0 = 0; // switch uart ON
UART1_CR2_TIEN = 0; // no interrupt on tx buffer underflow
UART1_CR2_TCIEN = 0; // no interrupt on tx transfer complete
#ifdef UART1_RX_BUFFER_SIZE
UART1_CR2_RIEN = 1; // 0/1 no/yes interrupt on rx
uart1_rx_clear();
#else
UART1_CR2_RIEN = 0; // 0/1 no/yes interrupt on rx
#endif
UART1_CR2_ILIEN = 0; // no interrupt on line free
UART1_CR2_TEN = 1; // switch on transmitter
UART1_CR2_REN = 1; // switch on receiver
UART1_CR2_SBK = 0; // no break char
UART1_CR3_STOP = 0; // 1 stop bit
}
Спойлер
Код: Выделить всё
#pragma vector=UART1_R_RXNE_vector
__interrupt void uart_rx_interrupt(void){
uint8_t data = UART1_DR;
//uart1_rx_push(data);
}если точку останова из обработчика убираю и иду программу пошагово то как только прилетает первый байт - у меня отладка зависает, т.е. уходит в исполнение последней строки кода main на которой нажал F10 и больше не возвращается. Не важно какая строка кода, ависает именно с прилетом первого байта
- Реклама
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
так?
а как же информация о том, что он сбрасывается после чтения из UART_DR?
Код: Выделить всё
UART1_SR_RXNE = 0;This bit is set by hardware when the content of the RDR shift register has been transferred to the
UART_DR register. An interrupt is generated if RIEN=1 in the UART_CR2 register. It is cleared by a
read to the UART_DR register. In UART2 and UART3, it can also be cleared by writing 0.
0: Data is not received
1: Received data is ready to be read.
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
У меня есть подозрение, что чтение регистра данных в обработчике компилятор вообще вынес, т.к. дальше с этими данными никаких операций не производится.
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
возможно, хотя висло и до того как я строку ниже закоментировалa5021 писал(а):У меня есть подозрение, что чтение регистра данных в обработчике компилятор вообще вынес, т.к. дальше с этими данными никаких операций не производится.
поставил принудительный сброс флага, виснуть перестало
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
мне бы сначала принять пакет, когда заработает то можно из любопытства убрать принудительный сброс и проверить будет работать или нет
пока что у меня ерунда выходит. С другого МК через RS485 шлю бакет со стартовым символом
по началу мусор прилетал
поставил паузу после переключения у передатчика max485 на передачу в 100мсек, стартовый символ поймал
но остальные данные - опять нули...
т.е. пока у меня прием на STM8 не работает, где то я ошибаюсь
хотя передача уже отлажена, в обратную сторону все работает на ура
пока что у меня ерунда выходит. С другого МК через RS485 шлю бакет со стартовым символом
по началу мусор прилетал
поставил паузу после переключения у передатчика max485 на передачу в 100мсек, стартовый символ поймал
но остальные данные - опять нули...
т.е. пока у меня прием на STM8 не работает, где то я ошибаюсь
хотя передача уже отлажена, в обратную сторону все работает на ура
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
Заработало, было две проблемы - косяк в организации буфера и потребовалось вставить задержки после переключения max485 перед передачей и задержка после передачи до возврата в режим чтения
Задержки сделал тупыми циклами. А как правильно делать задержки в единицы и десятки мсек?
Задержки сделал тупыми циклами. А как правильно делать задержки в единицы и десятки мсек?
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
задержки на таймере так можно организовать:
http://sam3s-demo-source.googlecode.com ... rc/delay.c
там правда для STM8L, для STM8S должно подойти
http://sam3s-demo-source.googlecode.com ... rc/delay.c
там правда для STM8L, для STM8S должно подойти
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
Спасибо
На таймере как сделать я знаю
Но это решение специфичное, его сложно/не возможно в библиотеку запихнуть
На таймере как сделать я знаю
Но это решение специфичное, его сложно/не возможно в библиотеку запихнуть
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
это еще есть, не проверял
http://forum.easyelectronics.ru/viewtop ... 33&t=16950
http://forum.easyelectronics.ru/viewtop ... 33&t=16950
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
вопрос про IAR
Почему у меня меню Project/Download имеет все пункты серые не активные?
Приходится грузить прошивку через Project/Download & Debug
програматор оригинальны stlink/v2
Почему у меня меню Project/Download имеет все пункты серые не активные?
Приходится грузить прошивку через Project/Download & Debug
програматор оригинальны stlink/v2
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
в Help написано:
В ST Visual Develop + бесплатный Cosmic можно прошиватьDownload
Commands for flash download and erase. Note that these menu commands are not available in IAR Embedded Workbench for STMicroelectronics STM8.
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
понял
не то, чтобы сильно напрягает - один лишний клик мышью, чтобы закрыть дебаггер после прошивки
но отсутствие возможности просто прошить без отладки выглядит странно
идти в другую программу для прошивки получится десяток лишних кликов, это явно лишнее
не то, чтобы сильно напрягает - один лишний клик мышью, чтобы закрыть дебаггер после прошивки
но отсутствие возможности просто прошить без отладки выглядит странно
идти в другую программу для прошивки получится десяток лишних кликов, это явно лишнее
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Спасение утопающих...
Есть в ST Visual develop файлик STVP_CmdLine.exe это командная строка для программатора. В иаре Tools->Configure Tools... можно указать этот экзешник и параметры командной строки. тогда можно прошить всего двумя кликами. Проверил - вроде работает, только прицепить чего нибудь в виде таргета пока нечего было. Лог прямо в окошко output иара:
-BoardName=ST-LINK -Port=USB -ProgMode=SWD -Device=STM8S003F3 -FileProg=d:\Work\STM8.wrk\Proj\TrDsTi20STM8S003F3P6\Release\Exe\TrDsTi20STM8S003F3P6.hex
Есть в ST Visual develop файлик STVP_CmdLine.exe это командная строка для программатора. В иаре Tools->Configure Tools... можно указать этот экзешник и параметры командной строки. тогда можно прошить всего двумя кликами. Проверил - вроде работает, только прицепить чего нибудь в виде таргета пока нечего было. Лог прямо в окошко output иара:
параметры такие:STVP_CmdLine version 1.6
Verbose ON
Log activity ON
Display Progress OFF
Message box warning if protect option byte ON
Loop mode ON
Erase device OFF
Blank check device OFF
Verify device ON
Configuration:
BoardName=ST-LINK ST-LINK_ID=0 Device=STM8S003F3 Port=USB ProgMode=SWD
>>> Filling PROGRAM MEMORY image in computer with Blank Value
<<< Filling PROGRAM MEMORY image in computer succeeds
>>> Loading file d:\Work\STM8.wrk\Proj\TrDsTi20STM8S003F3P6\Release\Exe\TrDsTi20STM8S003F3P6.hex in PROGRAM MEMORY image in computer
<<< Loading file succeeds
Hit 'Esc' key to abort during communication.
>>> Programming PROGRAM MEMORY
(API) ERROR : Cannot communicate with the device !
Check the SWD cable connection and check all the needed pin connections on the SWD connector.
Reboot the ST-Link with USB cable.
<<< Programming PROGRAM MEMORY fails
-BoardName=ST-LINK -Port=USB -ProgMode=SWD -Device=STM8S003F3 -FileProg=d:\Work\STM8.wrk\Proj\TrDsTi20STM8S003F3P6\Release\Exe\TrDsTi20STM8S003F3P6.hex


