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

IAR (контроллер aduc845) как в программе сделать прыжок на другой адрес?

Необходимо на контроллере ADuC845 в среде IAR, с которой работал раньше, перейти по заданному адресу, где находится выполняемая функция.

Никак не удается перейти с одной программы в другую.

Располагаю для теста две программы незивисымые, с разной частотой мигания светодиода. По заданным для перехода адресам находится то что нужно, проверял вычитыванием памяти flash.

 

Пробовал переход и так

asm ("LJMP 0x0400");

и так

((void (*)())0x0000)();

 

Почитал хорошую темку ПО для перепрошивки 8051, Дайте мудрый совет, но там не про IAR. Может пересесть с любимого?

 

Как перейти с программы начальной адрес которой 0x100 на другую прогу с начальным адресом 0x400?

 

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


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

Почему 0x0000?

 

Не обращайте внимание на это, это я пробовал варианты в 2-х программах. Я пробовал два адреса в разных программах.

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


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

Почему 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

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


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

Что упускаю?

Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес.

Вопросы:

1. Как получены эти две программы? Ранее было написано - "независимые". Т.е. надо понимать: есть два проекта - каждый даёт свой HEX?

2. Как Вы их объединили и записали в память программ?

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


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

Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес.

 

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

 

1. Как получены эти две программы? Ранее было написано - "независимые". Т.е. надо понимать: есть два проекта - каждый даёт свой HEX?

 

Да, два разных проекта. Физически один проект для теста, в одной программе задаю адрес старта, и делаю jmp на другой адрес, создаю HEX. Затем в этом проете меняю адрес расположения программы, меняю адрес jmp на первую программу, создаю HEX. В друх программах разные мигания светодиодом. В результате получаю 2 HEX.

 

 

Верятно, хотя код программы и начинается с адреса 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

 

Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес.

Похоже, что точка входа, далее вычитанный hex

000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF

 

04 27 вместо 0400

 

И всеже чтобы разобраться теоретически, что плохого делается при переходе на 0x0400 адрес?

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

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


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

Объединенный файл вручную

Ясно видно, что при объединении двух файлов результирующий файл имеет "перекрывающуюся" область с адресами 0,1,2.

По этим адресам в первоначальных файлах размещаются команды LJMP:

- в первом файле на адрес 127h

- во втором файле на адрес 427h

Эти адреса и являются - "точками входа" в Ваши программы (их и нужно использовать при переходах). В зависимости от того, какая программа должна стартовать первой тот LJMP нужно и оставить, а второй убрать (первая строка файла отдельной программы, начинающаяся на ":03...")

 

И всеже чтобы разобраться теоретически, что плохого делается при переходе на 0x0400 адрес?

Вы задали линкеру: использовать память программ, начиная с адреса 400h. Линкер это и выполняет, но не обязательно этот адрес будет "стартовым", начиная с этого адреса могут следовать (так оно и получается в Вашем случае) некие подпрограммы или данные, размещаемые в памяти программ. Передавать же на них управление - "не хорошо".

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


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

 

Похоже, что точка входа, далее вычитанный hex

000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF

 

04 27 вместо 0400

 

 

Палыч, спасибо за наталкивание

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


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

Не скажу за IAR, но в KEIL помимо указания адреса Ликеру для верхней программы, необходимо также в ручную поправить стартап файл. Ибо он содержит директиву ORG 0, для вектора сброса. Скорее всего это директива есть в обоих проекта, поэтому и перетирается.

 

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


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

 

Если бутлодер находится вначале то необходимо в него добавить команды которые будут автоматически перенаправлять прерывания во вторую программу

 

В настройках проекта второй программы достаточно указать смещение кода программы, вторую программу заргузить при помощи бутлодера...

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


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

Палыч все правильно сказал. Осталось дождаться ответа автора о результате.

 

 

из-за аксиомы (04 27 вместо 0400), которую я не сумел постичь,

 

сделал так: в линкере указал расположение 0400 кода, при прыжке на этот код из другой программы указал 0427 (ljmp)

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

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


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

некрасиво, при пересборке проекта адрес 0x427 может измениться. тогда придется опять руками править.

"Аксиома" постигается просто. Обратите внимание на мой пост и стартаповый файл второй программы (той которая с адреса 0x400).

директива ORG 0 говорит разместить дальнейший код (данные) по фиксированному адресу (в нашем случае 0 -адрес сброса). При этом остальные настройки линкера (в смысле указанные адреса) игнорируются.

По этому адресу обычно располагается инструкция LJMP _START. Метка _START располагается уже в перемещаемом сегменте, который линкер успешно размещает по адресам указанным в настройках проекта.

Предлагаю еще пару экспериментов для последующих размышлений.

1. При ручной сборке общего HEX-файла поменяйте порядок программ. При считывании увидите. что адрес перехода по сбросу поменяется

2. Создайте двоичные образы обоих программ (hex2bin например) При этом увидите, что вторая программа имеет по адресу 0 некие данные (точнее инструкцию перехода на основную программу)

 

 

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


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

некрасиво, при пересборке проекта адрес 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.

Или есть другие пути?

 

project_aduc.html

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


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

Я работаю с кейлом, поэтому конкретно про ИАР не скажу.

Должен быть асемблерный файл в проекте. У меня он называется 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 ; ну и так далее

Изменено пользователем редактор

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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