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

haker_fox

Модератор
  • Постов

    7 287
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

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


  1. Только, если такие прерывания будут не одиночные по отношению к уже обрабатываемому прерыванию - будет потеря событий, что говорит о неверном дизайне системы. Хотя, не обязательно. Если это какая-нибудь кнопка, то дребезг, породивший N событий, не так страшен.

  2. 2 hours ago, Xenia said:

    А я наоборот опасалась, что если сниму флаг прерывания раньше, чем закончу выполнять обработчик, то прерывание сможет возникнуть еще раз, после чего станет неясно, какой из обработчиков выполнится первым.

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

  3. 4 hours ago, passer_by said:

    всё равно желанья нет какую-нибудь мысль хорошую здесь обнародовать?

    Будьте терпеливее. Это всё же форум, а не частная консультация. Сейчас выходные. Люди на дачах и огородах могут быть. Или, уточнив что-либо, поняли, что ответить не могут. Не надо пытаться вытребовать ответ.

  4. 3 minutes ago, jcxz said:

    Да, Вы правы

    Уф) Самое главное, что совместными усилиями нам удалось отдать верный и нужный приказ инструментарию) Надеюсь, что данный топик принесёт пользу коллегам по форуму💗

    4 minutes ago, jcxz said:

    Вчера я не пробовал запускать ваш код на реальном камне

    По правде говоря, я даже не рассчитывал на такое) Ведь запуск чужого кода на своём железе - трата собственного времени, что не всегда возможно)))

  5. 2 minutes ago, Arlleex said:

    Вот я и говорил, немцы хоть и немного напридумывали насчет RAM, но задокументировали свои мысли))

    Шведы) Они пока ещё шведы) А так - да, как Вы и говорили в другом посте: мощная оптимизация со средствами борьбы против её последствий)

  6. 19 hours ago, pyroman said:

    a const volatile object, declare it with the __ro_placement attribute. See

    Вах! А это спасло отца русской демократии, т.е. меня! Вот это да! Спасибище!!!!

    static const volatile __ro_placement CalInfo calInfo @ ".calInfo" {

    Оптимизация: spee, no size constraint.

    Содержимое скрипта линкера:

    Spoiler
    /*###ICF### Section handled by ICF editor, don't touch! ****/
    /*-Editor annotation file-*/
    /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x08000000;
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
    define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
    define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
    define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
    /*-Sizes-*/
    define symbol __ICFEDIT_size_cstack__ = 0x400;
    define symbol __ICFEDIT_size_heap__   = 0;
    /**** End of ICF editor section. ###ICF###*/
    
    define memory mem with size = 4G;
    define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
    define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
    
    define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
    define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
    
    initialize by copy { readwrite };
    
    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
    
    define symbol CAL_INFO_PAGE_COUNT  = 9;
    define symbol CAL_INFO_PAGE_SIZE  = 1024;
    
    define block CAL_INFO_BLOCK with alignment = 8, size = CAL_INFO_PAGE_COUNT * CAL_INFO_PAGE_SIZE, fixed order
                                {readonly section .calInfo};
    
    place at address mem: 0x0800DC00 {block CAL_INFO_BLOCK};
    
    place in ROM_region   { readonly };
    place in RAM_region   { readwrite,
                            block CSTACK, block HEAP };
    
    export symbol __ICFEDIT_region_RAM_start__;
    export symbol __ICFEDIT_region_RAM_end__;

     

    Данные из map-файла:

    "A1", part 1 of 2:                         0x200c
      CAL_INFO_BLOCK               0x800'dc00  0x2400  <Block>
        .calInfo         const     0x800'dc00  0x200c  main.o [1]
                                 - 0x800'fc0c  0x200c
        
        
    calInfo                  0x800'dc00  0x200c  Data  Lc  main.o [1]    

    Кусок листинга со светодиодом:

    Spoiler
      321          
        322              s_calLed::set(!isCalibrated());
       \                     ??main_16: (+1)
       \      0x630   0x....             LDR      R1,??DataTable2_14
       \      0x632   0x7A08             LDRB     R0,[R1, #+8]
       \      0x634   0x2800             CMP      R0,#+0
       \      0x636   0xD002             BEQ      ??main_36
       \      0x638   0x2080             MOVS     R0,#+128
       \      0x63A   0x03C0             LSLS     R0,R0,#+15
       \      0x63C   0xE000             B        ??main_37
       \                     ??main_36: (+1)
       \      0x63E   0x9801             LDR      R0,[SP, #+4]
       \                     ??main_37: (+1)
       \      0x640   0x2290             MOVS     R2,#+144
       \      0x642   0x05D2             LSLS     R2,R2,#+23
       \      0x644   0x6190             STR      R0,[R2, #+24]
        323          

     

    Попытки инициализации в startup-коде нет.

  7. 13 hours ago, jcxz said:

    PS: IAR v7.80.4 for ARM.

    На новые IARы переходить, как я вижу, Вы не спешите))) Как я понимаю, в этой версии Вам уже известны все его шаблоны поведения. А в новых  продуктах возможно и новые баги появились😀

  8. Модератор: @passer_by, на форуме принято общение на русском языке. А это значит, что выражать свои мысли следует грамматически верно и связанно. Старайтесь избегать пространственных рассуждений на отвлечённые темы, которые сильно запутывают поставленный вопрос, а также не употребляйте бранные выражения. Всё это написано в правилах форума, которые я рекомендую Вам перечитать. Пока Ваше сообщение я отредактировал самостоятельно. Прошу быть наперёд аккуратнее.

  9. 12 hours ago, jcxz said:

    И никаких ошибок или варнингов при компиляции.

    Сделал всё также)

    Действительно, никаких ошибок или предупреждений.

    Светодиод теперь зависит от состояния переменной:

    Spoiler
       321          
        322              s_calLed::set(!isCalibrated());
       \                     ??main_13: (+1)
       \      0x402   0x....             LDR      R1,??DataTable2_14
       \      0x404   0x7A08             LDRB     R0,[R1, #+8]
       \      0x406   0x2800             CMP      R0,#+0
       \      0x408   0xD00E             BEQ      ??main_34
       \      0x40A   0x2080             MOVS     R0,#+128
       \      0x40C   0x03C0             LSLS     R0,R0,#+15
       \      0x40E   0xE00C             B        ??main_35
       \                     ??main_2:
       \      0x410   0xE000'E100        DC32     0xe000e100
       \      0x414   0x....'....        DC32     s_generalCal
       \      0x418   0x0003'EFD0        DC32     0x3efd0
       \      0x41C   0x0000'2198        DC32     0x2198
       \      0x420   0x0001'F7E8        DC32     0x1f7e8
       \      0x424   0x0001'4FF0        DC32     0x14ff0
       \                     ??main_34: (+1)
       \      0x428   0x2040             MOVS     R0,#+64
       \                     ??main_35: (+1)
       \      0x42A   0x2290             MOVS     R2,#+144
       \      0x42C   0x05D2             LSLS     R2,R2,#+23
       \      0x42E   0x6190             STR      R0,[R2, #+24]

    Скрипт линкера выглядит вот так:

    Spoiler
    /*###ICF### Section handled by ICF editor, don't touch! ****/
    /*-Editor annotation file-*/
    /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x08000000;
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
    define symbol __ICFEDIT_region_ROM_end__   = 0x0800DBFF;
    define symbol CAL_INFO_ROM_START           = 0x0800DC00;
    define symbol CAL_INFO_ROM_END             = 0x0800FFFF; 
    define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
    define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
    /*-Sizes-*/
    define symbol __ICFEDIT_size_cstack__ = 0x800;
    define symbol __ICFEDIT_size_heap__   = 0;
    /**** End of ICF editor section. ###ICF###*/
    
    define memory mem with size = 4G;
    define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
    define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
    
    define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
    define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
    
    initialize by copy { readwrite };
    
    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
    
    define region CAL_INFO_BLOCK = mem:[ from CAL_INFO_ROM_START to CAL_INFO_ROM_END];
    
    do not initialize {section .calInfo};
    
    place in CAL_INFO_BLOCK {section .calInfo};
    
    place in ROM_region   { readonly };
    place in RAM_region   { readwrite,
                            block CSTACK, block HEAP };
    
    export symbol __ICFEDIT_region_RAM_start__;
    export symbol __ICFEDIT_region_RAM_end__;

     

    Инициализация константы написана таким обрзаом:

    Spoiler
    #pragma pack(push, 2) // flash writing by 2 bytes only
    struct GeneralCal {
        uint16_t z0;
        uint16_t z1;
        uint16_t z2;
        uint16_t z3;
        bool calibrated;
    };
    #pragma pack(pop)
    
    #pragma pack(push, 1)
    struct CalInfo {
        GeneralCal general;
        uint16_t tbl[4096];
    };
    
    __root volatile const CalInfo calInfo @ ".calInfo" {
        {
            3502, 3318, 369, 184, // see readme.md
            false,
        },{
            0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
            0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002,
            0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002 и т.д.

     

    Но при запуске процессор попадает в HardFault. Расшифровка показала, что проблема тут:

    image.png.bc60dc5df82851f1a44952813dc0485b.png

    А в R0 находится адрес 0x0800DC00. Т.е. startup-код пытается инициализировать константный объект.

     

    Из документации на линкер следует, что директива do not initialize относится только к секциям типа zeroinit, т.е. в данном случае она не работает(((

  10. 1 hour ago, vit496 said:

    читать uint32_t x = *(volatile uint32_t*) 0x08070000

    А где красота кода? Оперировать в сишнике адресами - дурной тон, ИМХО. Для этого линкер есть.

    1 hour ago, Arlleex said:

    т.к. при банальной смене распределения памяти все уедет и по новой сиди адреса правь.

    Угу)

    45 minutes ago, jcxz said:

    я не вижу у Вас в скрипте компоновщика задания способа инициализации для секции ".calInfo".

    Ух, спасибо! Я чувствовал, что у Вас будет индивидуальный рецепт, как всегда💗 Завтра буду пробовать на работе)

    29 minutes ago, jcxz said:

    Как видно - и читается и используется в коде calInfo.general.calibrated правильно.

    Это внушает надежду!🤝🙏

  11. 1 minute ago, Arlleex said:

    Ну тогда пусть линкер считает, что это RW область, а адреса подпихните из нужной области Flash.

    Всё же выходит, что поставленная проблема в топике - нетривиальная?))))

     

    Интересно бы ещё услышать, что уважаемый @jcxz скажет)))

  12. 6 minutes ago, KSN said:

    Использую такой подход:

    А я вот выше показал, что у меня такой подход с включенной оптимизацией balanced или speed не приводит к результату. Даже если указатель на структуру объявлен со словом volatile. Данные из флеши читаются, да. Но не используются. Что не противоречит стандарту.

  13. 2 minutes ago, vit496 said:

    А как вы собираетесь изменять значения, после того, как удастся разместить во FLASH?

    Перепишу память с помощью контроллера памяти. Да и это переписывается. Всё работает. Пока уровень оптимизации низкий.

    P.S. Забить на всё. Сдать проект с отключенной оптимизацией. там кода чуть-чуть. Это датчик...

  14. Посмотрел листинг. Если calInfo расположена в ОЗУ, что, конечно же неправильно, то данные переменной читаются и, что главное, учитываются!

        322              s_calLed::set(!isCalibrated());
       \                     ??main_12: (+1)
       \      0x5A2   0x....             LDR      R1,??DataTable2_14
       \      0x5A4   0x7A08             LDRB     R0,[R1, #+8]
       \      0x5A6   0x2800             CMP      R0,#+0
       \      0x5A8   0xD002             BEQ      ??main_33
       \      0x5AA   0x2080             MOVS     R0,#+128
       \      0x5AC   0x03C0             LSLS     R0,R0,#+15
       \      0x5AE   0xE000             B        ??main_34
       \                     ??main_33: (+1)
       \      0x5B0   0x2040             MOVS     R0,#+64
       \                     ??main_34: (+1)
       \      0x5B2   0x2290             MOVS     R2,#+144
       \      0x5B4   0x05D2             LSLS     R2,R2,#+23
       \      0x5B6   0x6190             STR      R0,[R2, #+24]

     

    1 minute ago, MrYuran said:

    Профессиональный рост - это когда растет количество подчиненных )

    А флешь после череды инцидентов лично я читаю/пишу в строго определенной функции с контролем целостности данных посредством CRC

    Спасибо за наставления, конечно, но к делу это отношения не имеет😀

  15. 3 minutes ago, vit496 said:

    отсутствие const

    Ничего не меняет(

    // header
    volatile const CalInfo calInfo @ ".calInfo" {
    
    // map
    calInfo                 0x2000'0000  0x200c  Data  Lc  main.o [1]

     

    3 minutes ago, Arlleex said:

    Разумеется, нет.

    Тогда я не знаю, что её заставляет укладываться в ОЗУ...

  16. Попробую. По сути блок нужен, чтобы занять N 1024-байтных страниц флеши. И не допустить попадания туда посторонней информации. Т.к. флешь стирается секторами. В принципе, этот блок необязателен. Ведь можно просто подрезать границы для readonly секции, куда помещается код и константы.

  17. Теперь внаглую увеличил объём ОЗУ, такого, конечно нет. И всё легло! Но во флешь!

    define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
    define symbol __ICFEDIT_region_RAM_end__   = 0x20002FFF;

    image.png.a783846b26a6cb72a57762474eaeafca.png

    1 minute ago, MrYuran said:

    А может, таки взять и запретить оптимизировать? Поставить прагму на функцию чтения флеши

    Там ни одна функция читает из этой константы... Да и хочу уже понять, а что такое происходит. Это же мой профессиональный рост...

    P.S. Возникает ощущение, что блоку CAL_INFO_BLOCL назначается аттрибут rw, линкер смотрит на это и примеряет блок к ОЗУ. Не входит? Пофиг, что нужно реально класть по другому адресу. Выдаём ошибку. Увеличили ОЗУ. Блок входит. Но кладём в флешь по указанному адресу.

    P.S.S. Секции он уложил во флешь. А саму переменную calInfo в ОЗУ!

    calInfo                 0x2000'0000  0x200c  Data  Gb  main.o [1]

     

  18. Вообще непонятно.

    image.thumb.png.c893f31ad2110e67b373f97313f0e978.png

    Размер секции он посчитал верно: 9кБ. Но обозначил её как readwrite. Т.е. пытается разместить в ОЗУ. Но выше в сообщении пишет, что уже не может разместить 0x2838 байт, т.е. 10 206 байт, а это не 9 кБ. Блин. Вообще запутался.

  19. Пробовал)

    image.thumb.png.ad45a2f96cbb5c88317ca7db9a9772b5.png

    В R0 читается значение, но не используется.

    image.thumb.png.7221257f17be5fa6ed51a4a6400ef558.png

    1 minute ago, Arlleex said:

    Думаю, для начала нужно разобраться, откуда накопилось 0x2838 байтов для размещения в секции, которая заведомо меньше этого размера.

    Я и говорю, что в ОЗУ эта константа не должна размещаться) Она должна лежать во флешь! Но если добавить volatile, то линкер в обход правил её туда пытается запихнуть.

    6 minutes ago, Arlleex said:

    А volatile законно указало, что оптимизировать нельзя, таблицу оставить как есть, линкер глянул на все это дело и высказал свое "фи".

    Вы дописали своё сообщение. Увидел позже. Но я и не могу в этом разобраться. Я же приложил скрипт) Там явно указано, куда размещать эту огромную константу)

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