|
IAR (контроллер aduc845) как в программе сделать прыжок на другой адрес?, переход из App в Bootloader |
|
|
|
Oct 24 2012, 14:09
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Необходимо на контроллере ADuC845 в среде IAR, с которой работал раньше, перейти по заданному адресу, где находится выполняемая функция. Никак не удается перейти с одной программы в другую. Располагаю для теста две программы незивисымые, с разной частотой мигания светодиода. По заданным для перехода адресам находится то что нужно, проверял вычитыванием памяти flash. Пробовал переход и так Код asm ("LJMP 0x0400"); и так Код ((void (*)())0x0000)(); Почитал хорошую темку ПО для перепрошивки 8051, Дайте мудрый совет, но там не про IAR. Может пересесть с любимого? Как перейти с программы начальной адрес которой 0x100 на другую прогу с начальным адресом 0x400?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 17)
|
Oct 24 2012, 17:48
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(_Артём_ @ Oct 24 2012, 19:28)  Почему 0x0000? Не обращайте внимание на это, это я пробовал варианты в 2-х программах. Я пробовал два адреса в разных программах.
|
|
|
|
|
Oct 25 2012, 05:56
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(_Артём_ @ Oct 24 2012, 19:28)  Почему 0x0000? Если код находится по адресу 0x0400 и сделать прыжок в на этот адрес 0x0400, то программа куда-то улетает. Но если прыжок сделать на 0x0000, то нормальное выполнение. Что упускаю? Выдержка из файла "Debug\List\*.list", может знающий сразу что-то увидит, чего я не вижу... Результат 1 и 2 метода один и тот же: программа улетает и не возвращается. Код 60 ((void (*)())0x0400)(); // переход к штатной программе \ ??main_2: \ 000042 ; Setup parameters for indirect call \ 000042 120100 LCALL 0x100 61 82 asm ("LJMP 0x0400"); \ 000045 020400 LJMP 0x0400 \ 000048 80B9 SJMP ??main_0 \ 00004A REQUIRE _A_P2
Сообщение отредактировал Jhohn - Oct 25 2012, 06:07
|
|
|
|
|
Oct 25 2012, 06:18
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Jhohn @ Oct 25 2012, 09:56)  Что упускаю? Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. Вопросы: 1. Как получены эти две программы? Ранее было написано - "независимые". Т.е. надо понимать: есть два проекта - каждый даёт свой HEX? 2. Как Вы их объединили и записали в память программ?
|
|
|
|
|
Oct 25 2012, 07:47
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(Палыч @ Oct 25 2012, 10:18)  Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. Было предположение, поэтому сделал вычитку памяти flash, когда вычитал криминала не нашел, две программы находились там где указывал в линкере. Цитата(Палыч @ Oct 25 2012, 10:18)  1. Как получены эти две программы? Ранее было написано - "независимые". Т.е. надо понимать: есть два проекта - каждый даёт свой HEX? Да, два разных проекта. Физически один проект для теста, в одной программе задаю адрес старта, и делаю jmp на другой адрес, создаю HEX. Затем в этом проете меняю адрес расположения программы, меняю адрес jmp на первую программу, создаю HEX. В друх программах разные мигания светодиодом. В результате получаю 2 HEX. Цитата(Палыч @ Oct 25 2012, 10:18)  Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. 2. Как Вы их объединили и записали в память программ? Первая программа Код :03000000020127D3 :1001000000000080FB120133B900030201217810C6 :100110009001397A0CBA00028007E493A3F608DA5A :10012000F91201AD12010075D00075819F53A7FE31 :10013000020105790153A7FE22E803000000000038 :100140000001000000C3E7960809E7960809E79652 :100150000809E79622E627F60809E637F60809E6D1 :1001600037F60809E637F622E7F60809E7F6080940 :10017000E7F60809E7F62253A7FE758400D083D07E :1001800082CEC0E0EFC0E0C0207808E608C0E0DE24 :10019000FAE473C0D074072FD0D0F8D0E0F618DF9F :1001A000FAD020D0E0FFD0E0FE53A7FE2212024496 :1001B0007910780C120168850C08850D09850E0AE6 :1001C000850F0B7E007F00C3EE940AEF9400A2D24D :1001D00065D033501A63A080E5A0AA08AB09AC0A29 :1001E000AD0B1201F4EE2401FEEF3400FF80D802C3 :1001F000040080BC7408120177E5812404F581E5D0 :100200008124FDF8EAF608EBF608ECF608EDF6793D :1002100014780C120168850C08850D09850E0A8575 :100220000F0BE58124FDF879081201455009791872 :10023000780812015580EB15811581158115817F94 :1002400008020193D29ED29C759E83759D1253A77E :02025000FE228C :00012701D7 :00000001FF Вторая программа Код :03000000020427D0 :1004000000000080FB120433B900030204217810BD :100410009004397A0CBA00028007E493A3F608DA54 :10042000F91204AD12040075D00075819F53A7FE28 :10043000020405790153A7FE2210270000000000E6 :100440000001000000C3E7960809E7960809E7964F :100450000809E79622E627F60809E637F60809E6CE :1004600037F60809E637F622E7F60809E7F608093D :10047000E7F60809E7F62253A7FE758400D083D07B :1004800082CEC0E0EFC0E0C0207808E608C0E0DE21 :10049000FAE473C0D074072FD0D0F8D0E0F618DF9C :1004A000FAD020D0E0FFD0E0FE53A7FE2212054490 :1004B0007910780C120468850C08850D09850E0AE0 :1004C000850F0B7E007F00C3EE940AEF9400A2D24A :1004D00065D033501A63A080E5A0AA08AB09AC0A26 :1004E000AD0B1204F4EE2401FEEF3400FF80D802BD :1004F000010080BC7408120477E5812404F581E5CD :100500008124FDF8EAF608EBF608ECF608EDF6793A :1005100014780C120468850C08850D09850E0A856F :100520000F0BE58124FDF87908120445500979186C :10053000780812045580EB15811581158115817F8E :1005400008020493D29ED29C759E83759D1253A778 :02055000FE2289 :00042701D4 :00000001FF Объединенный файл вручную Код :03000000020127D3 :1001000000000080FB120133B900030201217810C6 :100110009001397A0CBA00028007E493A3F608DA5A :10012000F91201AD12010075D00075819F53A7FE31 :10013000020105790153A7FE22E803000000000038 :100140000001000000C3E7960809E7960809E79652 :100150000809E79622E627F60809E637F60809E6D1 :1001600037F60809E637F622E7F60809E7F6080940 :10017000E7F60809E7F62253A7FE758400D083D07E :1001800082CEC0E0EFC0E0C0207808E608C0E0DE24 :10019000FAE473C0D074072FD0D0F8D0E0F618DF9F :1001A000FAD020D0E0FFD0E0FE53A7FE2212024496 :1001B0007910780C120168850C08850D09850E0AE6 :1001C000850F0B7E007F00C3EE940AEF9400A2D24D :1001D00065D033501A63A080E5A0AA08AB09AC0A29 :1001E000AD0B1201F4EE2401FEEF3400FF80D802C3 :1001F000040080BC7408120177E5812404F581E5D0 :100200008124FDF8EAF608EBF608ECF608EDF6793D :1002100014780C120168850C08850D09850E0A8575 :100220000F0BE58124FDF879081201455009791872 :10023000780812015580EB15811581158115817F94 :1002400008020193D29ED29C759E83759D1253A77E :02025000FE228C :03000000020427D0 :1004000000000080FB120433B900030204217810BD :100410009004397A0CBA00028007E493A3F608DA54 :10042000F91204AD12040075D00075819F53A7FE28 :10043000020405790153A7FE2210270000000000E6 :100440000001000000C3E7960809E7960809E7964F :100450000809E79622E627F60809E637F60809E6CE :1004600037F60809E637F622E7F60809E7F608093D :10047000E7F60809E7F62253A7FE758400D083D07B :1004800082CEC0E0EFC0E0C0207808E608C0E0DE21 :10049000FAE473C0D074072FD0D0F8D0E0F618DF9C :1004A000FAD020D0E0FFD0E0FE53A7FE2212054490 :1004B0007910780C120468850C08850D09850E0AE0 :1004C000850F0B7E007F00C3EE940AEF9400A2D24A :1004D00065D033501A63A080E5A0AA08AB09AC0A26 :1004E000AD0B1204F4EE2401FEEF3400FF80D802BD :1004F000010080BC7408120477E5812404F581E5CD :100500008124FDF8EAF608EBF608ECF608EDF6793A :1005100014780C120468850C08850D09850E0A856F :100520000F0BE58124FDF87908120445500979186C :10053000780812045580EB15811581158115817F8E :1005400008020493D29ED29C759E83759D1253A778 :02055000FE2289 :00042701D4 :00000001FF Вычитанная память из контроллера (просто чтение изнутри и передача по UART) Код U8 __code *p = (U8 __code *)0x000000; Код 000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF 000002 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000003 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000004 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000005 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000006 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000007 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000008 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000009 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000011 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000012 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000013 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000014 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000015 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000016 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000017 00 00 00 80 FB 12 01 33 B9 00 03 02 01 21 78 10 000018 90 01 39 7A 0C BA 00 02 80 07 E4 93 A3 F6 08 DA 000019 F9 12 01 AD 12 01 00 75 D0 00 75 81 9F 53 A7 FE 000020 02 01 05 79 01 53 A7 FE 22 E8 03 00 00 00 00 00 000021 00 01 00 00 00 C3 E7 96 08 09 E7 96 08 09 E7 96 000022 08 09 E7 96 22 E6 27 F6 08 09 E6 37 F6 08 09 E6 000023 37 F6 08 09 E6 37 F6 22 E7 F6 08 09 E7 F6 08 09 000024 E7 F6 08 09 E7 F6 22 53 A7 FE 75 84 00 D0 83 D0 000025 82 CE C0 E0 EF C0 E0 C0 20 78 08 E6 08 C0 E0 DE 000026 FA E4 73 C0 D0 74 07 2F D0 D0 F8 D0 E0 F6 18 DF 000027 FA D0 20 D0 E0 FF D0 E0 FE 53 A7 FE 22 12 02 44 000028 79 10 78 0C 12 01 68 85 0C 08 85 0D 09 85 0E 0A 000029 85 0F 0B 7E 00 7F 00 C3 EE 94 0A EF 94 00 A2 D2 000030 65 D0 33 50 1A 63 A0 80 E5 A0 AA 08 AB 09 AC 0A 000031 AD 0B 12 01 F4 EE 24 01 FE EF 34 00 FF 80 D8 02 000032 04 00 80 BC 74 08 12 01 77 E5 81 24 04 F5 81 E5 000033 81 24 FD F8 EA F6 08 EB F6 08 EC F6 08 ED F6 79 000034 14 78 0C 12 01 68 85 0C 08 85 0D 09 85 0E 0A 85 000035 0F 0B E5 81 24 FD F8 79 08 12 01 45 50 09 79 18 000036 78 08 12 01 55 80 EB 15 81 15 81 15 81 15 81 7F 000037 08 02 01 93 D2 9E D2 9C 75 9E 83 75 9D 12 53 A7 000038 FE 22 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000039 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000041 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000042 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000043 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000044 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000045 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000046 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000047 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000048 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000049 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000051 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000052 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000053 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000054 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000055 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000056 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000057 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000058 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000059 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000061 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000062 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000063 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000064 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000065 00 00 00 80 FB 12 04 33 B9 00 03 02 04 21 78 10 000066 90 04 39 7A 10 BA 00 02 80 07 E4 93 A3 F6 08 DA 000067 F9 12 04 B1 12 04 00 75 D0 00 75 81 9F 53 A7 FE 000068 02 04 05 79 01 53 A7 FE 22 10 27 00 00 40 9C 00 000069 00 00 00 00 00 01 00 00 00 C3 E7 96 08 09 E7 96 000070 08 09 E7 96 08 09 E7 96 22 E6 27 F6 08 09 E6 37 000071 F6 08 09 E6 37 F6 08 09 E6 37 F6 22 E7 F6 08 09 000072 E7 F6 08 09 E7 F6 08 09 E7 F6 22 53 A7 FE 75 84 000073 00 D0 83 D0 82 CE C0 E0 EF C0 E0 C0 20 78 08 E6 000074 08 C0 E0 DE FA E4 73 C0 D0 74 07 2F D0 D0 F8 D0 000075 E0 F6 18 DF FA D0 20 D0 E0 FF D0 E0 FE 53 A7 FE 000076 22 12 05 96 79 10 78 0C 12 04 6C 85 0C 08 85 0D 000077 09 85 0E 0A 85 0F 0B 7E 00 7F 00 C3 EE 94 0A EF 000078 94 00 A2 D2 65 D0 33 50 1A 63 A0 80 E5 A0 AA 08 000079 AB 09 AC 0A AD 0B 12 05 46 EE 24 01 FE EF 34 00 000080 FF 80 D8 05 A7 75 82 00 75 83 00 7E 00 7F 00 C3 000081 EE 94 D0 EF 94 07 50 26 43 A7 01 C0 82 C0 83 05 000082 A7 D0 83 D0 82 75 84 00 E4 93 F5 0C 05 A7 A3 A9 000083 0C 12 05 A4 EE 24 01 FE EF 34 00 FF 80 D1 79 14 000084 78 0C 12 04 6C AA 0C AB 0D AC 0E AD 0F 12 05 46 000085 02 01 00 02 04 B4 74 08 12 04 7B E5 81 24 04 F5 000086 81 E5 81 24 FD F8 EA F6 08 EB F6 08 EC F6 08 ED 000087 F6 79 18 78 0C 12 04 6C 85 0C 08 85 0D 09 85 0E 000088 0A 85 0F 0B E5 81 24 FD F8 79 08 12 04 49 50 09 000089 79 1C 78 08 12 04 59 80 EB 15 81 15 81 15 81 15 000090 81 7F 08 02 04 97 D2 9E D2 9C 75 9E 83 75 9D 12 000091 53 A7 FE 22 C2 99 89 99 A2 99 50 FC C2 99 53 A7 000092 FE 22 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000093 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000094 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000095 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000096 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000097 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000098 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000099 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000100 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000101 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000102 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000103 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000104 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000105 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000106 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000107 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000108 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000109 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000110 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000111 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000112 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000113 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000114 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000115 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000116 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000117 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000118 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000119 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000120 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000121 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000122 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000123 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000124 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000125 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Цитата(Палыч @ Oct 25 2012, 10:18)  Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. Похоже, что точка входа, далее вычитанный hex Код 000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF 04 27 вместо 0400И всеже чтобы разобраться теоретически, что плохого делается при переходе на 0x0400 адрес?
Сообщение отредактировал Jhohn - Oct 25 2012, 07:38
|
|
|
|
|
Oct 25 2012, 07:54
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Jhohn @ Oct 25 2012, 10:56)  Объединенный файл вручную Ясно видно, что при объединении двух файлов результирующий файл имеет "перекрывающуюся" область с адресами 0,1,2. По этим адресам в первоначальных файлах размещаются команды LJMP: - в первом файле на адрес 127h - во втором файле на адрес 427h Эти адреса и являются - "точками входа" в Ваши программы (их и нужно использовать при переходах). В зависимости от того, какая программа должна стартовать первой тот LJMP нужно и оставить, а второй убрать (первая строка файла отдельной программы, начинающаяся на ":03...") Цитата(Jhohn @ Oct 25 2012, 11:47)  И всеже чтобы разобраться теоретически, что плохого делается при переходе на 0x0400 адрес? Вы задали линкеру: использовать память программ, начиная с адреса 400h. Линкер это и выполняет, но не обязательно этот адрес будет "стартовым", начиная с этого адреса могут следовать (так оно и получается в Вашем случае) некие подпрограммы или данные, размещаемые в памяти программ. Передавать же на них управление - "не хорошо".
|
|
|
|
|
Oct 25 2012, 07:58
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Похоже, что точка входа, далее вычитанный hex Код 000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF 04 27 вместо 0400Палыч, спасибо за наталкивание
|
|
|
|
|
Nov 7 2012, 12:52
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(Lagman @ Nov 3 2012, 22:31)  Палыч все правильно сказал. Осталось дождаться ответа автора о результате. из-за аксиомы (04 27 вместо 0400), которую я не сумел постичь, сделал так: в линкере указал расположение 0400 кода, при прыжке на этот код из другой программы указал 0427 (ljmp)
Сообщение отредактировал Jhohn - Nov 7 2012, 14:29
|
|
|
|
|
Nov 8 2012, 08:01
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(редактор @ Nov 8 2012, 10:26)  некрасиво, при пересборке проекта адрес 0x427 может измениться. Это да, я это вижу. Однако похоже, что при одной и тоже оптимизации приращение к абсолютному адресу стабильно 0x27 Я проанализировал, на сколько мог map-файл. В частности я увидел в нем: Код Program entry at : CODE 0000E027 Relocatable, from module : CSTARTUP Понял о чем вы говорили: Код Cstartup Code that sets up the system before the application starts executing. Это относительно теории (в теории всегда важно разбираться), но на практике вижу, что я буду, как и прежде, смотреть этот "CSTARTUP" в map-файле, и устанавливать на него LJMP. Или есть другие пути?
|
|
|
|
|
Nov 9 2012, 06:45
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Я работаю с кейлом, поэтому конкретно про ИАР не скажу. Должен быть асемблерный файл в проекте. У меня он называется startup.a51. Среда сама предлагает добавлять его в проект при создании. У вас должно быть нечто подобное. В этом файле несколько инструкций на ассемблере, которые проводят начальную инициализацию Обычно это обнуление памяти, установка стека и предача управления сишным функциям. Вот начало моего стандартного файла. Код CSEG AT 0 ; Директива ассемблера. Устанавливает АБСОЛЮТНЫЙ АДРЕС для секции кода. ; Линкер не может поменять этот адрес ; Именно здесь нужно откорректировать адрес для верхней программы. ; Тогда точкой входа в нее всегда будет именно этот адрес ?C_STARTUP: LJMP STARTUP1 ; непосредственно переход с вектора сброса. ; эту секцию линкер разместит в соответствии с установками RSEG ?C_C51STARTUP; начало перемещаемой секции
STARTUP1: IF IDATALEN <> 0 MOV R0,#IDATALEN - 1 ; здесь начинается обнуление памяти CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ; ну и так далее
Сообщение отредактировал редактор - Nov 9 2012, 06:49
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
Nov 12 2012, 11:13
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Спасибо, редактор. Поверхностным взглядом подобного файла не нашел, может где-то в настройка проекта, но быстренько взглянув тоже или не нашел, или нет. Руководство пока отложило обновление ПО внутри устройства назвав ее "дополнительной примочкой"  - жесть, конечно. Устройство состоит из 100 звеньев и более, опускается в скважину, чтоб обновить ПО придется вынуть, все устройство разобрать, вместо того чтобы сделать все нормально. Это я так поплакался, кто еще может меня понять как не коллеги ))
|
|
|
|
|
Feb 7 2013, 08:26
|
Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Из: Беларусь, Минск
Пользователь №: 60 563

|
Делал bootloader для SyLabs C8051F022 в Keil. Проект организовывал так: 1) Проект для самого загрузчика. 2) Проект с полезным кодом. В загрузчике указал располагать код в области памяти начиная с 0xF000 такой директивой линковщику: CODE(0F000h, ?PR?MAIN?UPDATER_F02x(0F000h)). В проекте с полезным кодом вызов загрузчика: void (*update_firmware)(); // pointer to bootloader memory ..... update_firmware = (void code*)0xF000; IE = 0; update_firmware(); // go to bootloader menu При такой организации перекрытие быть может, только если размер полезного кода достигнет адреса 0xF000. Весь же startup code располагается по адресам 0х0000 и 0xF000 для программы и загрузчика соответственно. Правда прерываниями в загрузчике пожертвовал, чтобы не заморачиваться с переопределением векторов. Пример брал из аппнота для силаба. Вдруг поможет. UPD. Да, а зачем Вы объединяете hex-файлы bootloader'a и программы? Я в чистый контроллер заливаю bootloader, переход на него после сброса добавляет сама среда, из bootload'a загружаю саму прошивку (2-й hex-файл). Можно загрузить 2-й hex отладчиком/программатором, но тогда нужно выключить очистку flash перед программирование.
Сообщение отредактировал DO_SL - Feb 7 2013, 08:53
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|