Перейти к содержанию
    

Petka

Свой
  • Постов

    1 438
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Petka


  1. ...

    Вопрос

    Готовая прошивка есть под 7.3728 кварц и мегу 168 ?

    ...

    Нет.

     

    ...

    Вопрос

    Или опять собирать.

    Соберётся, но работать не будет. Те версии, что я собирал для кварца 7,3727 были "особенные". Для того, что бы программатор успевал на малой частоте выполнять нужную работу была выкинута часть расширенного функционала и проведена мелкая оптимизация. Если ОЧЕНЬ надо, то попробую найти те исходники. Но как говорится без гарантий =)

  2. Petka, спасибо и за программатор и за то, что до сих пор отвечаете на вопросы.

    Стал использовать Atmel Studio 7. Всё удобно в ней и замечательно. И шьётся в ней всё очень быстро. Одна беда - постоянно, перед прошивкой, вылазит сообщение:

    ...

    Проверьте номиналы резисторов в программаторе.

  3. Вам просто следовало-бы наконец понять, что "do-while-zero" является сама по себе ненужным трюком и еще в каких-то "эквивалентах" не нуждается.

    ...

    Согласен, конструкция не нужна при одном или нескольких нижеследующих случаях.

     

    1) Если в работе используется только один компилятор. (IAR к примеру)

    2) Если в работе используется только одна архитектура. (ARM к примеру)

    3) Если в работе участвует только один человек. (С высокой культурой программирования)

    4) Если в работе не требуется следовать стандартам индустрии. (MISRA C к примеру)

    5) Если в работе не требуется использовать макросы-как-функции. (Для целей отладки, например)

    6) Если в работе используется компилятор с полностью отключенной оптимизацией, или настолько древний, что константы в условиях не обрабатываются на стадии компиляции.

    7) Если в работе принято не признавать своих заблуждений.

  4. Ну то есть что вы сначала оспаривали мои слова, а потом с ними согласились, это мой провал? Ну ок, "гуру" меня размазал.

    ...

    Не утруждайтесь. Это такой стиль. Или как принято говорить: двойные стандарты. Когда я в этой теме просил "гуру" дать ссылки на подтверждение своих голословных заявлений (http://electronix.ru/forum/index.php?s=&showtopic=130098&view=findpost&p=1361284) , то "гуру" не соизволил ничего ответить по существу дела. Вместо этого "гуру" зачем-то приплёл не относящийся к делу пустой "for(;;)" прекрасно понимая что это совсем не эквивалент do-while-zero конструкции. Забавно получилось, что "гуру" вместо признания своей ошибки начал загонять себя ещё глубже, ссылаясь на "творца Си" Денниса Ритчи. Однако, "гуру" забыл что в сеть попали исходники самых первых трансляторов. По исходникам становится очевидно, что конструкция for вообще отсутствовала в первом компиляторе а для циклов "творец" использовал while.

     

    P.S. Будьте добрее. Всем хороших выходных.

  5. К сожалению, в GCC такого не нашел (

     

    Буду пока смотреть в сторону скрипта линковки

    Как было сказано выше можно на регионы памяти назначать целиком единицы линковки. К примеру всё из startup.o размещать во внутренней памяти а всё остальное во внешней.

  6. Может кто подскажет, как сказать линковщику, что есть внешняя RAM?

    Использую LPCXpresso 7.9.0.

    В настройках проекта (MCU setting) добавил соответствующую секцию, но не помогает.

    При линковке сообщение, что не хватает внутреннего ОЗУ... Во внешнее линковать и не пытается.

    Гуглить "скрипт линкера".

  7. ...

    Ты откуда взял это выражение с двойными скобками? Я лет 30 назад из K&R - просто другого не было ничего :) и с ТЕХ ПОР ТАК ПИШУ. Сейчас скачал 3 издание, там на вскидку попытался найти но все уже какое-то причесанное под учебник с явными операторами сравнения.

    ...

    Тут такое дело...

    Код от "Самого" Ритчи: https://github.com/mortdeus/legacy-cc/blob/...120c/c11.c#L219

    И не надо фантазировать на пустом месте по поводу скобок.

     

    P.S. Так я от Вас и не получил подтверждения Ваших слов про:

    "...ибо while(константа) принципиально ошибочное выражение,..."

    Получил только очередные фантазии про цикл for(;;), которого ВООБЩЕ не было в первых компилаторах Си. А while был. И автор языка для циклов использовал именно while.

  8. Вы, очевидно не поверите,

    Очевидно, тут не вопрос веры.

    но компилятор скобки не "выкинет", он выполнит НЕ РАССУЖДАЯ предписанные ими действия. С пробелами еще проще - их игнорирование описано стандартом, так-что компилятор де-юре не думает, что кто хотел сказать пробелами.

    Сказали "А", говорите и "Б". Если "лишние" пробельные символы компилятор может удалять(игнорировать) без предупреждений, то и валидные конструкции "while(0)", "for(;;)", "#if 0", по той-же самой логике транслятор должен обрабатывать согласно стандарту "НЕ РАССУЖДАЯ".

    Что бы не уводить обсуждение в сторону прошу подкрепить или опровергнуть Ваше заявление

    ...Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности...

    Откуда вы это взяли? Есть какой-то стандарт где это описано? Отраслевые инструкции? Исследования? В книжке какой-то прочитали? Бложик? Твиттер? Сплетни? С удовольствием ознакомлюсь с источником такой информации.

     

  9. Не смотря на то, что Вам так забавно, все так и происходит, если активизировать полный набор warnings. По умолчанию - не ругается.

    Резюме: "вменяемый компилятор" по умолчанию не выдаёт предупреждение на вполне законную конструкцию. Плюсик к IAR Systems.

    Не давать, а ПРЕДУПРЕЖДАТЬ, что написанная программистом конструкция была бессмысленна и компилятор нее выкинул, но может программист не пожалевший времени на нажатие кнопок, все-же рассчитывал на какой-то другой эффект???

    В качестве литературной гиперболы:

     

    в конструкции:

    r = (a * b) + (c * d);

    тоже есть "лишние конструкции", которые транслятор "выкинет". Например, скобки вообще "лишние". Да и пробелы совсем не нужны. Может программист "все-же рассчитывал этими скобками на какой-то другой эффект"?

    Резюме: наличие широкого спектра предупреждений в трансляторах это хорошо. Но порою производители "инструментов" немного перегибают палку.

     

    P.S. Модераторам: из топика имеет смысл обсуждение конструкции do-while-zero вынести в отдельную тему.

  10. Это просто борьба с потенциальной ошибкой, котороая ДЕЙСТВИТЕЛЬНО имеет очень большую вероятность быть сделанной. Вот по этой причине и пошли на соглащение, что тут уж все способы хороши.

    1) С точки зрения стандарта Си конструкция do-while-zero не является "Implementation-Defined Behavior", "Undefined behavior" или пр. Так что поводов "давать по рукам" программисту никаких нет.

    2) Уважаемый Вами инструмент от "IAR Systems" имеет возможность проверять в том числе и правила "MISRA C". Было бы забавно наблюдать что на единственно возможную конструкцию согласно правилам "MISRA C" транслятор при проверке будет выдавать предупреждение. :smile3046:

  11. ....

    Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности большинство компиляторописателей забили на предупреждение :(

    ....

    Что-то задело меня это безапелляционное утверждение.

     

    Для Си-программистов встраиваемых систем группа "энтузиастов" из индустрии разработала стандарт "MISRA C".

    Приведу небольшую выдержку из стандарта редакции 2004 года.

     

    Rule 19.4 (required): C macros shall only expand to a braced initialiser, a constant,

    a string literal, a parenthesised expression, a type qualifier, a

    storage class specifier, or a do-while-zero construct.

    [Koenig 82–84]

    These are the only permitted uses of macros. Storage class specifiers and type qualifiers include

    keywords such as extern, static and const. Any other use of #define could lead to unexpected

    behaviour when substitution is made, or to very hard-to-read code.

    In particular macros shall not be used to define statements or parts of statements except the use

    of the do-while construct. Nor shall macros redefine the syntax of the language. All brackets of

    whatever type ( ) { } [ ] in the macro replacement list shall be balanced.

    The do-while-zero construct (see example below) is the only permitted mechanism for having

    complete statements in a macro body. The do-while-zero construct is used to wrap a series of one

    or more statements and ensure correct behaviour. Note: the semicolon must be omitted from the

    end of the macro body.

    For example:

    /* The following are compliant */
    #define PI 3.14159F /* Constant */
    #define XSTAL 10000000 /* Constant */
    #define CLOCK (XSTAL/16) /* Constant expression */
    #define PLUS2(X) ((X) + 2) /* Macro expanding to expression */
    #define STOR extern /* storage class specifier */
    #define INIT(value){ (value), 0, 0} /* braced initialiser */
    #define CAT (PI) /* parenthesised expression */
    #define FILE_A "filename.h" /* string literal */
    #define READ_TIME_32() \
    do { \
        DISABLE_INTERRUPTS (); \
        time_now = (uint32_t)TIMER_HI << 16; \
        time_now = time_now | (uint32_t)TIMER_LO; \
        ENABLE_INTERRUPTS (); \
    } while (0) /* example of do-while-zero */
    /* the following are NOT compliant */
    #define int32_t long /* use typedef instead */
    #define STARTIF if( /* unbalanced () and language redefinition */
    #define CAT PI /* non-parenthesised expression */

     

    Так что если заниматься программированием для встраиваемых систем, такая нотация макросов является не только "допустимой", но и обязательной (с точки зрения MISRA C).

  12.     /* copy-init variables */
        memcpy(&__data_start__, &__etext, &__data_end__ - &__data_start__);
        /* zero-init variables */
        memset(&__bss_start__, 0, &__bss_end__ - &__bss_start__);

    Та же проблема, но теперь вынесена в libc.

    1) Какие гарантии, что memset не рассчитывает на заранее инициализированную/очищенную область памяти?

    2) При оптимизации LTO будет ли вообще этот memset как вызов libc или цикл очистки будет "заинлайнен"?

     

    Всё это меня очень сильно смущает. Есть ли какие-нибудь гарантированные способы обойти эти неоднозначности? (без АСМа)

     

  13. ...

    Ну а на кортексе даже startup на C пишется естественно.

    ...

    Как вы умудряетесь в startup на C делать очистку секции "bss" (инициализированые нулями данные)?

    У меня это единственная часть, которая делается инлайн-ассемблером. Если делать на Си, то код обнуления области памяти не всегда корректно работает (зависит от компилятора). Видимо, компилятор рассчитывает на изначально нулевое значение переменной счётчика, что не так на стадии стартапа.

  14. Не согласен, вот например, smartfusion2. И это не монстр от xilinx or altera with cortex-a9(x2).

    Согласен, классный чип. Внешние конфигурашки не нужны, даже старшие чипы не требуют никаких радиаторов, встроенный кортекс выбирает команды на частоте 160 МГц (это Ксении на заметку, что не только у япошек есть быстрый флеш для контроллеров)

    Шина процика выведена в ПЛИС, что позволяет сделать практически любое количество необходимой периферии. 100 дополнительных ШИМов? Легко! Столько же УАРТов? Можно! Десятки аппаратных умножителей позволят решать целочисленные задачи DSP. Мне понравилось.

  15. Подскажите плиз где скачать последнию прошивку и печатку, а то что то полазил и не нашел, не хочется всю ветку опять просматривать.

    тут в первом посте: http://electronix.ru/forum/index.php?showtopic=42679 под строкой "Актуальные на 8 июля 2009 года документы:"

  16. вроде что то стало доходить: должно быть три файла: один хекс с частями для обоих ядер, и два ELF , по одному для каждого ядра, для отладки.

    Да, самый разумный вариант.

     

    Но как сие получить - пока все равно загадка.

    Сначала отделите мухи от котлет. Сделайте два "проекта" всё что относится к M0 в один, остальное в другой. Если будут сложности по сборке каждого проекта - обращайтесь.

    Потом с помощью objcopy и srecord можно всё это поместить в один хекс.

    Начните с раздельных ELF.

  17. Не считал этот момент принципиальным, ибо нынешний скрипт линкера дает оба формата. Но если нужно выбрать что то одно, я предпочел бы elf.

    Хм. Скрипт линкера не даёт вообще никаких выходных файлов. Вообще он к выходным форматам отношения не имеет.

    Если нужно получить один общий HEX, то лучший способ - ознакомиться с у утилитами objcopy и srecord

    Общий elf имеет смысл получать только для целей отладки. Т.к. для M0 ядра у вас отладочной информации в HEX скорее всего не содержится, то преобразование HEX -> ELF ИМХО бессмысленно.

    П.С.

    Опишите подробнее, что у вас имеется, и что вы хотите сделать.

    Что вы называете "проектом"? Для меня "проект" в разделе "opensource" это, например, Makefile.

  18. В сухом остатке:

    - Как прилинковать файл?

    - Да так же, как и все остальные!

     

    Этот файл, по оношению к проекту, сторонний. Вот как то и нужно линкеру указать путь к нему, адрес линковки и т.п.

    Как это сделать - об этом и был вопрос

    Назревает вопрос:

    Что вы хотите получить на выходе "объединения" кода от двух ядер? Один общий HEX файл или один общий elf файл?

  19. Versaloon - доступных входов-выходов немного. Они предлагают JTAG/UART. VersaloonHandy - только заявлен. Форум на их сайте - не работает. Из большого количества заявленых только скрипт тестер поддержан/описан.

    С микроконтроллерами я знаком, но не хотелось бы отлаживать и вылавливать чужие баги в чужом софте. Модуль нужен для вылавливания багов в собстенных устройствах.

    Я работал только с Mini версией версалуна. SPI и I2C точно работают. vsprog - документирована не очень хорошо, но разобраться можно. В этой софтинке как раз можно запускать скрипты с использованием SPI, GPIO и т.д. Про небольшое количество GPIO - тут либо если нужно готовое железо и не хватает портов, то надо подбирать другое железо. Если есть возможность подпаяться к чипу, можно вывести хоть все GPIO готовой железки. Либо самому развести. Софт на микроконтроллере легко дорабатывается под другой чип/разводку/другое количество GPIO. Софт на компе тоже достаточно легко дорабатывается. Всё доступно в исходных кодах. Для себя софт я сам собирал. Правда мне нужно было под Linux.

     

×
×
  • Создать...