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

Здравствуйте,

 

как можно заставить линковщик (IAR 4.42A) считать контрольную сумму только для указанных сегментов:

 

PRGENTRY                           00002004 - 0000207F          7C   rel    2
ICODE                              00002080 - 00002633         5B4   rel    2
DIFUNCT                            00002634 - 00002637           4   rel    2
CODE                               00002638 - 0000F39F        CD68   rel    2
INITTAB                            0000F3A0 - 0000F3B7          18   rel    2
DATA_ID                            0000F3B8 - 0000F3BB           4   rel    2
DATA_C                             0000F3BC - 0001386F        44B4   rel    2

 

т.е. с начала PRGENTRY до конца DATA_C?

 

Я могу сам посчитать и записать, но тогда отлаживать проблематично - мой бутлоадер отвергает то, что сделал линковщик :(

 

Спасибо.

Изменено пользователем meister

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за причуды? В начале прошивки указатель на сегмент с контрольной суммой, который, естественно линковать последним. Ваш загрузчик таким образом будет иметь и размер контролируемой области и месторасположение контрольной суммы посчитанной линкером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за причуды? В начале прошивки указатель на сегмент с контрольной суммой, который, естественно линковать последним. Ваш загрузчик таким образом будет иметь и размер контролируемой области и месторасположение контрольной суммы посчитанной линкером.

 

А линковщик? Ему как контролировать? Чтоб не по всему флэшу CRC считать (нижний адрес 0x2004 я могу захардкодить, а верхний? я хотел брать конец DATA_C).

Изменено пользователем meister

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтоб не по всему флэшу CRC считать

Начнем с простого вопроса - ЗАЧЕМ не по всему?

(нижний адрес 0x2004 я могу захардкодить,

Угу.

а верхний?

А верхний (старший) - я уже писал - и лежит, например, в 0x2000 а по нему уже лежит СRC. Все однако :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после CRC до конца флэш, считая, что там везде 0xFF.

 

Не сходится :(

 

Все диапазоны сделаны на манер STL (поэтому конец флэш 0x40000, а не 0x3FFFF).

 

-J2,crc16,,,,1,0=2004-3ffff

 

    unsigned short slow_crc16(unsigned short sum, u8_t const * p, unsigned short len)
    {
        while (len--)
        {
            int i;
            unsigned char byte = *p++;
            
            for (i = 0; i < 8; ++i)
            {
                unsigned long osum = sum;
                sum <<= 1;
                
                if (byte & 0x80)
                    sum |= 1;
                
                if (osum & 0x8000)
                    sum ^= 0x1021;
                
                byte <<= 1;
            }
        }
        return sum;
    }     
    
    
    bool is_code_valid(void)
    {
        if (validate_write_address(bootloader_programm_size))
        {
            u8_t const * const programm_begin = reinterpret_cast<u8_t const *>(0x2004);
            u8_t const * const programm_end = reinterpret_cast<u8_t const *>(bootloader_programm_size);
            u8_t const * const flash_end = reinterpret_cast<u8_t const *>(0x40000);
            
            u8_t const zero[] = {0, 0};

            u16_t crc = 0;
            crc = slow_crc16(crc, programm_begin, programm_end - programm_begin);
            crc = slow_crc16(crc, programm_end + 2, flash_end - programm_end - 2);
            crc = slow_crc16(crc, zero, 2);
            
            u16_t linker_crc; 
            my_memcpy(&linker_crc, programm_end, 2); // читается правильно
            
            return crc == linker_crc; // вообще не сходится, ни инвертирование, ни меняя endian.
        }
        else
        {
            return false;
        }
    }

 

    MODULE    PROGRAMM_SIZE;
    PUBLIC  bootloader_programm_size;
    EXTERN  __checksum;
    RSEG    PRGSIZE:CODE:NOROOT(2);

bootloader_programm_size DC32 __checksum;

    ENDMOD;

 

                ****************************************
                *                                      *
                *      SEGMENTS IN ADDRESS ORDER       *
                *                                      *
                ****************************************


SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
PRGSIZE                            00002000 - 00002003           4   rel    2
PRGENTRY                           00002004 - 0000207F          7C   rel    2
ICODE                              00002080 - 00002633         5B4   rel    2
DIFUNCT                            00002634 - 00002637           4   rel    2
CODE                               00002638 - 00014ED7       128A0   rel    2
INITTAB                            00014ED8 - 00014EEF          18   rel    2
DATA_ID                            00014EF0 - 00014EF3           4   rel    2
DATA_C                             00014EF4 - 000194FE        460B   rel    2
CHECKSUM                           000194FF - 00019500           2   rel    0
?FILL2                             00019501 - 0003FFFF       26AFF   rel    0


                ****************************************
                *                                      *
                *              CHECKSUMS               *
                *                                      *
                ****************************************

Symbol      Checksum  Memory  Start      End       Initial value
------      --------  ------  -----      ---       -------------
__checksum    0xe424   CODE   00002004 - 000194FE            0x0
                       CODE   00019501 - 0003FFFF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после...

Жуть какая-то - в один - от 0x2000 до CRC. За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

от 0x2000 до CRC.

 

Symbol      Checksum  Memory  Start      End       Initial value
------      --------  ------  -----      ---       -------------
__checksum    0xe424   CODE   0000200[b]4[/b] - 000194FE            0x0

 

За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя.

 

?FILL2                             00019501 - 0003FFFF       26AFF   rel    0

 

Туда запишется ?FILL2 - никаких других вариантов прошивки там не будет (raw binary файл у меня 256кб). Меня только терзают сомнения - не перепишется ли ISP c IAP отладчиком при этом. Или заполнение не пишется во флэш?

Изменено пользователем meister

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Туда запишется ?FILL2 - никаких других вариантов прошивки там не будет (raw binary файл у меня 256кб).

Зачем????? Вам платят побайтно?

Меня только терзают сомнения - не перепишется ли ISP c IAP отладчиком при этом.

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

 

Segments in Address Order 
Segment     Space     Start     End     Size     Kind     Align 
INTVEC         00002000 - 0000201F     20     Common     2 
ICODE         00002020 - 000022C3     2A4     Relative     3 
DIFUNCT         000022C4         Relative     2 
CODE         000022C4 - 0001075F     E49C     Relative     2 
INITTAB         00010760 - 00010777     18     Relative     2 
DATA_ID         00010778 - 00010F77     800     Relative     2 
DATA_C         00010F78 - 00012790     1819     Relative     2 
CHECKSUM         00012791 - 00012792     2     Relative     0 
DATA_I         40000000 - 400007FF     800     Relative     2 
DATA_Z         40000800 - 40001C37     1438     Relative     2 
SVC_STACK         40001C38 - 40001E37     200     Relative     3 
CSTACK         40001E38 - 40001E3F     8     Relative     3 
FIQ_STACK         40001E40 - 40001EBF     80     Relative     3 
IRQ_STACK         40001EC0 - 400020BF     200     Relative     3 
HEAP_RTOS         400020C0 - 400040FF     2040     Relative     3 
XXX_STACK         40007FE0 - 40007FFF     20     Relative     3 

ChecksumsSymbol    Checksum    Memory    Start    End    Initial value
__checksum    0xc2e2    CODE    00002000 - 00012790    0x0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем?????

 

Об этом и был мой самый первый вопрос. Сейчас CRC считается верно, но я не знаю, что писать в опции линковщика:

 

-J2,crc16,,,,1,0=2000-194FE

 

                ****************************************
                *                                      *
                *      SEGMENTS IN ADDRESS ORDER       *
                *                                      *
                ****************************************


SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
PRGSIZE                            00002000 - 00002003           4   rel    2
...
DATA_C                             00014EF4 - 000194FE        460B   rel    2

 

Но этот вариант мне не нравится - линковать дважды?

 

Я бы хотел линковщику написать типа

 

-J2,crc16,,,,1,0=SFB(PRGSIZE)-SFE(DATA_C)

 

но он такое не понимает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но я не знаю, что писать в опции линковщика:

В конце списка сегментов:

....

-Z(CONST)CHECKSUM=ROMSTART-ROMEND // to end of CODE block

....

Ну и собственно CRC

-Hff

-h(CODE)

-J2,crc16,,,,1,0

 

Это нежели Вам побайтно будут когда-нибудь платить :)

-Z(CODE)CHECKSUM#ROMSTART-ROMEND // to end of ROM block

и укажете всесь FLASH для CRC....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раньше отлично работало, а сегодня IAR сделал вот так:

 

CODE                               00001428 - 00010F9[b]9[/b]        FB72   rel    2
INITTAB                            00010F9[b]C[/b] - 00010FB3          18   rel    2

                ****************************************
                *                                      *
                *              CHECKSUMS               *
                *                                      *
                ****************************************

Symbol      Checksum  Memory  Start      End       Initial value
------      --------  ------  -----      ---       -------------
__checksum    0x2b89   CODE   00001000 - 00010F99            0x0
                       CODE   00010F9C - 00015357

 

То есть он не считает CRC с 00010F9A до 00010F9B. Как туда можно заполнитель вставить (чтобы считал)?

 

Линкую вот так:

-H00

-h(CODE)

-J2,crc16,,,,1,0=1000-3FFFF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как туда можно заполнитель вставить (чтобы считал)?

Убрать выравнивание сегмента с контрольной суммой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убрать выравнивание сегмента с контрольной суммой.

 

У меня пустота образовалась не между программой и контрольной суммой, а между сегментами программы. Пока проблему решил, переставив сегмент кода (его размер не кратен 4, с остальными сегментами мне пока везет :wacko: ) в самый конец.

 

PRGSIZE                            00001000 - 00001003           4   rel    2
PRGENTRY                           00001004 - 0000101B          18   rel    2
ICODE                              0000101C - 00001427         40C   rel    2
DIFUNCT                                 00001428                     rel    2
INITTAB                            00001428 - 0000143F          18   rel    2
DATA_ID                            00001440 - 00001443           4   rel    2
DATA_C                             00001444 - 000057E3        43A0   rel    2
CODE                               000057E4 - 00015355        FB72   rel    2
CHECKSUM                           00015356 - 00015357           2   rel    0

 

Хочется чего-нибудь понадежнее, завтра у меня размер ICODE, DATA_ID или DATA_C перестанет быть кратным 4 и опять...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочется чего-нибудь понадежнее, завтра у меня размер ICODE, DATA_ID или DATA_C перестанет быть кратным 4 и опять...

Это невероятно, если только специально не постараться.

А вообще тогда придется всместо общего указания (CODE) поколдовать c указаниями линкеру

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно в пропроцессоре ассемблера в зависимости от адреса сделать заглушку размером 2 или 4 байта (есть где-нибудь полный мануал на ассемблер ИАРа?)?

 

Пока хочу выровнять контрольную сумму (потом это будет любой другой сегмент, как возникнут проблемы):

 

CODE 00005804 - 0001548D FC8A rel 2

ALIGNER1 00015490 - 00015493 4 rel 1

CHECKSUM 00015494 - 00015495 2 rel 0

 

    RSEG    ALIGNER1:CONST:ROOT(1);
    PUBLIC  ALIGNERFILL1;

вот тут в зависимости от адреса
ALIGNERFILL1 DC32 0;
или
ALIGNERFILL1 DC16 0;

    ENDMOD;

Изменено пользователем meister

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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