Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » адрес функции или процедуры

Страниц (2): « 1 [2]
 

16. vik49 - 26 Марта, 2013 - 15:20:38 - перейти к сообщению
Напишу попозже.
(Добавление)
Ну вот кое что прояснилось !!!

//с переменной расположенной в SRAM всё OK
adr = ((word)&AdrPlanner);W2S(adr);cr; //0x007e
adr = (word)AdrPlanner;W2S(adr);cr; //0x0994

//с именем функции расположенной в FLASH NOOK
adr = ((word)&Planner);W2S(adr);cr; //0x04ca
adr = (word)Planner;W2S(adr);cr; //0x04ca

Modem SkyLink on ATmega8 RF ver14
Data ..... 24.03.2013
Fosc ..... 11059200hz
USART .... 115200bod
MODE ..... receive

007E
0994
04CA
04CA
17. vik49 - 27 Марта, 2013 - 22:02:39 - перейти к сообщению
Что нужно изменить в программе чтобы стал правильно работать разыменователь '&'
Он даёт неверный адрес имени располагающимся в области памяти FLASH.
Ведь это основы языка 'си'
Может быть существует какой то другой символ ?
В описании языка не нашел.
Хоть кто нибудь в этом форуме знает ?
А ?
Всем привет.
18. elmot - 27 Марта, 2013 - 22:29:40 - перейти к сообщению
vik49 пишет:
Что нужно изменить в программе чтобы стал правильно работать разыменователь '&'
Он даёт неверный адрес имени располагающимся в области памяти FLASH.
Ведь это основы языка 'си'
Может быть существует какой то другой символ ?
В описании языка не нашел.
Хоть кто нибудь в этом форуме знает ?
А ?
Всем привет.

Вообще-то ничего другого нет, потому что хватает амперсанда.
Почему адрес-то неверный? Какой должен быть?
19. vik49 - 28 Марта, 2013 - 13:48:38 - перейти к сообщению
28.03.2013
12:00

//кусок файла sym - его создаёт компилятор.
0000043a W __vector_1
0000043a W __vector_10
0000043a W __vector_12
0000043a W __vector_13
0000043a W __vector_15
0000043a W __vector_16
0000043a W __vector_17
0000043a W __vector_18
0000043a W __vector_2
0000043a W __vector_3
0000043a W __vector_4
0000043a W __vector_6
0000043a W __vector_7
0000043a W __vector_9
0000043c T svtd
00000448 T StopSin
0000044c T StartSin
00000452 T testSerialNum
0000045f W __stack
00000490 T lshift
000004ba T __vector_14
0000053e T __vector_8
0000058e T __vector_5
00000760 T decript
00000922 T showHopecode
0000093e T __vector_11
00000994 T Planner <= это стартовый адрес функции Planner();
000009a4 T main
00000aa2 T receive
00000b34 T find_Header
00000b90 T find_Preambule
00000c12 T recvCode
00000c46 T ByteSend

0994 <- адрес функции Planner();
Наконец-то мне удалось его получить.
Для этого пришлось написать этот кусок на ассемблере.
То есть я заменил строчку на языке "С"
на несколько строчек на ASMe

//вот фрагмент строки проги который давал неверный адрес:
//прога планировщика
//W2S - прога вывода на терминал значения адреса в hex формате
//cr - возврат каретки с переводом строки
adr = (word)&Planner; W2S(adr);cr;

//так компилировалась одна строка на "C"
//непонятные два символа gs ????
//пришлось их убрать и сразу адрес был получен !!!!
ldi r16,lo8(gs(Planner)) <- удалил gs
ldi r17,hi8(gs(Planner)) <- удалил gs
sts (adr)+1,r17
sts adr,r16
movw r24,r16
rcall W2S
rcall CAR

//вот результирующий текст
//это я написал на asmе
//вот тоже самое только на асме
asm ("ldi r16,lo8(Planner)"Подмигивающий;
asm ("ldi r17,hi8(Planner)"Подмигивающий;
asm ("sts (adr)+1,r17"Подмигивающий;
asm ("sts adr,r16"Подмигивающий;
asm ("movw r24,r16"Подмигивающий;
asm ("rcall W2S"Подмигивающий;
asm ("rcall CAR"Подмигивающий;

Короче символ "&" разыменования работает с ошибкой поэтому
я убрал одну строку на С заменив её на 7 строчек ассемблера.

Теперь всё работает !!!
Спасибо всем - теперь приоритетный планировщик на атмеге будет работать !!!
Пока.
(Добавление)
Ещё раз спасибо всем ребятам кто помогал.
Тему закрываю.
20. killgur - 28 Марта, 2013 - 15:43:19 - перейти к сообщению
Видимо не хватило тегов [code] либо они тоже неправильно работают