Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отладка для stm8
Шарага > Soft - НЕ железо > Программирование МК
_pasha
Привет.
Начало тут http://electronix.ru/forum/index.php?s=&am...t&p=1374082

Кладу начальный вариант чуть доработанного флешера
Нажмите для просмотра прикрепленного файла
на рассмотрение публики и для замечаний и предложений

Плюхи:
1. Сброс проца по выходу. Ващета надо ключом, но пока безусловно.
2. Консольный режим для debug_printf
Подробнее
2.1. Где-то в мейкфайле
включаем -DDBGLEVEL=1
0 - ничего не выводит
остальные градации на усмотрение

2.2.А в это время где-то в хедерах girl_crazy.gif
Код
#if defined(DBGLEVEL) && (DBGLEVEL != 0)
extern void __debug(const char messg[]);
#define debug(n) __debug(n)
#else
#define debug(n)
#endif

2.3. А в это время где-то в коде girl_crazy.gif girl_crazy.gif
Код
#if defined(DBGLEVEL) && (DBGLEVEL != 0)
#define CON_SYMB (*(volatile char *)0x3FF)
void __debug(const char messg[])
{
    const char *p = messg;
    while(*p)
    {
        CON_SYMB = *p++;
        while(CON_SYMB) idle(); // не забываем объявить тело суперлупа
    }
}
#endif


2.4. Соображения, почему 0x03FF
при вызове main() SDCC - он же ж тупой, и это хорошо, поскольку он декрементировал стек на 2 clapping.gif
ящетаю, шо ето прекрасно.

2.5. Что мы хотим этим всем сказать. Все (или почти все) знают как работает дебажный printf под ITM у stm32
Теперь и у нас такая же фича, т.е.
2.5.1. Записали байт в 0x03ff
2.5.2. Подождали пока его обнулят извне
2.5.3. Повторили сколько нужно.
3. Юзабилити
Код
$ ./stm8flash
Usage: ./stm8flash [-d address][-c programmer] [-p partno] [-s memtype] [-b bytes] [-r|-w|-v] <filename>
Additional option -d - open debug console for use in swim
     and poll one byte at specified address

$ ./stm8flash -c stlink -p stm8s003 -d 03ff
Determine FLASH area
Now we in console mode ready to poll address 0x 3FF. Press any key to exit
ddebug is enabled.debug is enabled.debug is enabled.n
*Canceled*


Нелинуксоидов просьба не беспокоить
кстати, никогда не писал под макось. как там keypressed() сделать?

Форк грязный, медленный, но работает.
Велкам на Эльх или сюда для предложений куда его допилить.

4.Неустранимые вещи:
4.1. операции wotf rotf останавливают cpu. Таким образом, на быстродействие это все влияет не лучшим образом.
вернее, с rotf еще можно пошаманить, избавиться от лишних записей в обслуге debug module


еще забыл. добавил в валидные расширения hex-формата кроме *.ihx родной обычный *.hex, ибо это одуреть можно... ihx...
Harbinger
ihx == Intel HeX. smile.gif
_pasha
Цитата(Harbinger @ 21.10.2015, 8:56) *
ihx == Intel HeX. smile.gif

ага, типа hex традиционно не Intel HeX girl_crazy.gif
---
попробовал самый тяжкий printf() - всего-то 2кб весит. Можно вообще без зазрения совести юзать. Это вам не АВР с тесными штанишками.

надо по debuglevel включать тяжесть оного.
зато как приятно, когда вообще ничего нет - а консоль ужо есть, скорость поднятия прерываний и прочего близка к скорости света girl_crazy.gif
_pasha
Цитата
при вызове main() SDCC - он же ж тупой, и это хорошо, поскольку он декрементировал стек на 2

оказалось, что он ни разу не тупой.
просто создавать или нет переменную для возврата из main() он решает исходя из погоды на Марсе.
т.е. при появлении подозрительного вывода нужно это место зарезервировать
Код
int main(void)
{
  volatile int dummy;
// далее по коду
}

alcoholic.gif дурдом
т.е. sdcc обнаружил, что до возврата дело не дойдет, unreachable code написал.
но в прошлом проекте - было то же самое. хто ж оттуда выходит... а переменную таки создал
_pasha
Не покидает желание запустить сабжа на малине.
Код
$uname -a
Linux raspberry 3.10.19+ #1 PREEMPT Tue Dec 3 19:11:42 MSK 2013 armv6l GNU/Linux

запустил под gdb
обнаружил пренеприятнейшую вещь
Код
while((c = getopt (argc, argv, "r:w:v:nc:p:s:b:d:")) != -1) {

оказалось что этот парсер по концовке выдает с = 0xFF и в
Код
switch(с)
он вываливался в default: и соответственно пишет usage тратата и exit -1
это говорит о том, что какого-то хера в тамошнем gcc char у нас по умолчанию unsigned alcoholic.gif
это пиздец. Сколько еще глюкавых программ из-за этого дебилизма - можно только догадываться.
подправил на signed char c - уже зашевелилось
Mr.Yuran
Паш, говорят, космик стал нахаляву smile.gif
Может, нуево уже, этот сдцц?
Цитата
New Cosmic CXSTM8 C-compiler completes free and unlimited development toolchain
Highly featured compiler supports entire STM8 family up to 128KB, with no restrictions on code size
Design-start investment cut to just $8 for STM8S-DISCOVERY kit hardware

Хотя третий пункт какой-то подозрительный
_pasha
hi.gif
stm8 как таковые интересуют только в виде stm8s003. А для этого ведь все есть. Почти все. girl_crazy.gif
Осталось таки посидеть с вопросами шустроты консоли,
допилить stm8flash для stlinkv2
и чтобы на малине все работало

автор похоже подзабил на свое детище.

и к тому же космик от нормального Си без "плюшечек" еще дальше чем сдцц. Т.е. там тупая копипаста не проходит.
_pasha
hi.gif
В общем, решил я задачку для stlinkv2
Гемора оказалось больше чем дофига. куча особенностей всяких. задолбало alcoholic.gif
Еще остался глюк. Подопытный камень как-то строго через раз пишет.
Раз стартует, раз - болт
Если не победю - выложу уже так как есть.
_pasha
Нажмите для просмотра прикрепленного файла
вот промежуточная.

остальное позже

Burner
Паша, или мож., кто другой в курсе - какое у STM8S быстродействие, т. е. сколько MIPS, или сишных команд в секунду?
Как-то я прикидывал, у меня получалось порядка 1,5 MIPS на 16 МГц. Поэтому я был уверен, что максимальное быстродействие STM8 сильно ниже такового у AVR. Потом мне кто-то сказал, что STM8 намного быстрее 1,5 MIPS.
Кто-нить проверял время исполнения программ?
_pasha
20DMIPS @ 24 MHz
вроде так у них написано
то бишь 13.3 на 16-ти
производительность ниже чем у авр, по идее, зато есть деление за 17 тактов и маленький контекст задачи.
их сложно сравнивать
ViKo
А что, мипсы - это сишные команды? От это твою мать...!
Если, все-таки, миллионы команд за секунду, то глянув в документацию и разглядев, за сколько тактов выполняется команда, может снизойти просветление мозгов.
Що, так и написано, DMIPS?
_pasha
Цитата(ViKo @ 7.5.2016, 17:11) *
А что, мипсы - это сишные команды? От это твою мать...!
Если, все-таки, миллионы команд за секунду, то глянув в документацию и разглядев, за сколько тактов выполняется команда, может снизойти просветление мозгов.
Що, так и написано, DMIPS?

Цитата
0,29 DMips/Mhz
– similar to some well known 16-bit CPU
performance –
16Mips
at
16MHz


в первоисточнике. http://www.emcu.it/STM8/STM-STM8.pdf

т.е. кто то гдето ошибается.
но мне эти цифры ни о чем не говорят. я точно знаю, что можно делать на них а что нельзя, - оценивая систему в целом, как и большинство себе подобных.
Burner
Спасибо, это уже кое-что.
Цитата
А что, мипсы - это сишные команды?

Не-а. Кста, Ваш вопрос подтверждает одну мою догадку.
ViKo
Цитата(Burner @ 8.5.2016, 3:37) *
Кста, Ваш вопрос подтверждает одну мою догадку.

Что Дристоны != Мипсам? Да, это нужно крепко запомнить. laughter2.gif
Burner
Да на здоровье smile.gif. Но это Ваша догадка. В мою Вы даже близко не попали.
Mr.Yuran
А я был неприятно удивлен, сколько команд (и тактов) нужно СМ3 для цикла while(pause--){}
После МСПшки, где ещё пару нопов нужно свтавить, чтобы 5 тактов на круг
Burner
А СМ3 - это что?
И сколько тактов получилось на 1 цикл?
Mr.Yuran
Цитата(Burner @ 19.5.2016, 11:08) *
А СМ3 - это что?
И сколько тактов получилось на 1 цикл?

C[ortex]M3

delay(8000000) при 24МГц обеспечивал моргание (переключение) светодиода раз в секунду.
ViKo
У меня - 4 такта.
Код
#pragma push
#pragma O3
__forceinline void FourCycl_delay(uint32_t FC)
{
__asm {
LOOP:
    SUBS FC, FC, #1
    BNE LOOP
  }
}
#pragma pop


Цитата(Mr.Yuran @ 19.5.2016, 11:14) *
delay(8000000) при 24МГц обеспечивал моргание (переключение) светодиода раз в секунду.

И сколько это в тактах? 3, что ли?
Mr.Yuran
а что такое прагма пуш и поп?
ViKo
Цитата(Mr.Yuran @ 19.5.2016, 11:57) *
а что такое прагма пуш и поп?

ARM ® Compiler v5.06 for µVision
armcc User Guide

Цитата
9.96 #pragma push
This pragma saves the current pragma state.
Related concepts
5.3 Controlling compiler diagnostic messages with pragmas on page 5-208.
Related references
9.95 #pragma pop on page 9-610.
Mr.Yuran
Цитата(ViKo @ 19.5.2016, 12:06) *
ARM ® Compiler v5.06 for µVision
armcc User Guide

А, понятно smile.gif
Православных не касается smile.gif
ViKo
Так что там насчет тактов, Юран?
Mr.Yuran
Цитата(ViKo @ 19.5.2016, 15:09) *
Так что там насчет тактов, Юран?

Получается, что три.
Провел следственный экспериМЕНТ:
Код
66           while(period >0){
08003e86:   b.n 0x8003e8a <Delay+10>
67               period --;
08003e88:   subs r3, #1
66           while(period >0){
08003e8a:   cmp r3, #0
08003e8c:   bne.n 0x8003e88 <Delay+8>
69       }

Но это после того, как написал волшебное слово register.
Код
void Delay(uint32_t register period)

До этого вдвое больше было.
ViKo
В ARM ® Cortex ® -M3 Processor Technical Reference Manual описаны команды и такты. Но точно не понять, сколько получится. От конвейера зависит. Я в отладчике видел 4 такта. Надо будет еще проверить.
Cortex круче MSP? facepalm.gif
_pasha
шо ви к кортексам привязались. их основное призвание считать арихметику побыстрее и иногда лазать по регистрам прерывания запрещать разрешать вместе с ПДП
сабж кстати, несмотря на 8 битность, неприятно удивляет невозможностью просто и красиво дергать ногаме в цикле
Harbinger
Из RAM ЕМНИП код выполняется с предсказуемыми таймингами, но существенно медленнее в целом (из FLASH за такт выбирается 4 байта, а из RAM - 1).
Что ещё плохо в STM8 - недостаточная температурная стабильность HSI, даже нормальная работа UART в индустриальном диапазоне температур не гарантируется (на практике STM8L при стабильном питании в 1% вписываются, но закладываться на это нельзя).
_pasha
давно не использую stm8
но чуваки которые делали texane stlink aka st-util оказывается додумались до такого:
Код
struct stlinky {
    uint32_t magic;
    uint32_t bufsize;
    uint32_t up_tail;
    uint32_t up_head;
    uint32_t dw_tail;
    uint32_t dw_head;
    char upbuf[CONFIG_LIB_STLINKY_BSIZE];
    char dwbuf[CONFIG_LIB_STLINKY_BSIZE];
} __attribute__ ((packed));
*/
#define STLINKY_MAGIC 0xDEADF00D


эта штука являет собой рингбуфер для отладочной консоли не поверх ITM (я сейчас об stm32) а прямо в памяти. найти начало структуры можно сканируя память на предмет означенного мажика
и в общем, можно заглянуть в потроха st-util в особенности st-term - и прикрутить к дудойту фичку girl_crazy.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.