реклама на сайте
подробности

 
 
> CHECKSUM
meister
сообщение Jan 28 2008, 15:10
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



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

как можно заставить линковщик (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?

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

Спасибо.

Сообщение отредактировал meister - Jan 28 2008, 15:10
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
zltigo
сообщение Jan 28 2008, 15:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Jan 28 2008, 15:55
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(zltigo @ Jan 28 2008, 18:50) *
Что за причуды? В начале прошивки указатель на сегмент с контрольной суммой, который, естественно линковать последним. Ваш загрузчик таким образом будет иметь и размер контролируемой области и месторасположение контрольной суммы посчитанной линкером.


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

Сообщение отредактировал meister - Jan 28 2008, 15:56
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2008, 16:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(meister @ Jan 28 2008, 18:55) *
Чтоб не по всему флэшу CRC считать

Начнем с простого вопроса - ЗАЧЕМ не по всему?
Цитата
(нижний адрес 0x2004 я могу захардкодить,

Угу.
Цитата
а верхний?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Jan 28 2008, 17:20
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



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

Не сходится sad.gif

Все диапазоны сделаны на манер 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2008, 17:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(meister @ Jan 28 2008, 20:20) *
Ладно, пусть верхняя граница будет концом флэша и вычислять crc в два диапазаона 0x2004 до CRC и после...

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Jan 28 2008, 18:31
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(zltigo @ Jan 28 2008, 20:29) *
от 0x2000 до CRC.


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


Цитата(zltigo @ Jan 28 2008, 20:29) *
За пределами этой прошивки может быть вообще-то еще всякая всячина, типа еще нескольких вариантов прошивки. Даже если нет, то считать контрольные суммы неиспользуемой области это параноя.


Код
?FILL2                             00019501 - 0003FFFF       26AFF   rel    0


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

Сообщение отредактировал meister - Jan 28 2008, 18:31
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2008, 18:40
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(meister @ Jan 28 2008, 21:31) *
Туда запишется ?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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Jan 29 2008, 09:58
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(zltigo @ Jan 28 2008, 21:40) *
Зачем?????


Об этом и был мой самый первый вопрос. Сейчас 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)

но он такое не понимает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 29 2008, 10:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(meister @ Jan 29 2008, 12:58) *
но я не знаю, что писать в опции линковщика:

В конце списка сегментов:
....
-Z(CONST)CHECKSUM=ROMSTART-ROMEND // to end of CODE block
....
Ну и собственно CRC
-Hff
-h(CODE)
-J2,crc16,,,,1,0

Это нежели Вам побайтно будут когда-нибудь платить smile.gif
-Z(CODE)CHECKSUM#ROMSTART-ROMEND // to end of ROM block
и укажете всесь FLASH для CRC....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Mar 27 2008, 16:58
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Раньше отлично работало, а сегодня 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 27 2008, 22:51
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(meister @ Mar 27 2008, 19:58) *
Как туда можно заполнитель вставить (чтобы считал)?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Mar 28 2008, 06:37
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(zltigo @ Mar 28 2008, 01:51) *
Убрать выравнивание сегмента с контрольной суммой.


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

Код
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 и опять...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 28 2008, 06:45
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(meister @ Mar 28 2008, 09:37) *
Хочется чего-нибудь понадежнее, завтра у меня размер ICODE, DATA_ID или DATA_C перестанет быть кратным 4 и опять...

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
meister
сообщение Mar 28 2008, 07:08
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Можно в пропроцессоре ассемблера в зависимости от адреса сделать заглушку размером 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 - Mar 28 2008, 07:09
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01532 секунд с 7
ELECTRONIX ©2004-2016