keil C51

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
       Доброго здоровья, All!

  сделал небольшую программку для ADuC816 на Keil С (7.08). Все бы было хорошо,
но решил я вместо свитча сделать таблицу функций, панимаешь. и натолкнулся на
непонятные мне грабли, а именно - программа перестала работать правильно. то
бишь, работать-то она работает, но результаты выдает неверные. таблицу описываю
следующим образом:

typedef double Create_Func(char par);
Create_Func code * code CreateF[] = {Create_TC, Create_TR2, Create_TR,
Create_C};

вызов, соответственно:

ADC_ResVals[prevN] = CreateF[(prevT < 3) ? prevT : 3](prevN);

вместо аналогичного свитча.

кстати, такое впечатление, что вызовы по таблице перестали работать не сразу, а
после превышения какого-то размера программы(?!).
кроме того, линкер выдает предупредительные сообщения типа

*** WARNING L13: RECURSIVE CALL TO SEGMENT
    SEGMENT: ?CO?ADC
    CALLER:  ?PR?_CREATE_C?ADC

связанные именно с появлением таблицы

куды бечь посоветуете?

    WBR, Сергей.                                     ICQ: 101347299

... Если действительность смешит, юмористы становятся летописцами.

keil C51
     Greetings, Sergei!

 Посмотрел я мессагу, посланную Sergei Tuchinski к All, и решил ответить:

 ST>   сделал небольшую программку для ADuC816 на Keil С (7.08). Все бы
 ST> было хорошо, но решил я вместо свитча сделать таблицу функций,
 ST> панимаешь. и натолкнулся на непонятные мне грабли, а именно -
 ST> программа перестала работать правильно. то бишь, работать-то она
 ST> работает, но результаты выдает неверные. таблицу описываю следующим
 ST> образом:

 ST> куды бечь посоветуете?

Куда всегда в таких случаях посылают - в... вообщем в документацию. Читать о
том как коppектиpовать деpево вызовов функций, сгенеpиpованого линкеpом. Он же
бедняга не знает, КАКИЕ у тебя там в таблице функции, ему надо об этом сказать
чтобы он пpавильно постpоил деpево.
Еще полезно почитать о механизме DATA OVERLAYING, чтобы понять откуда pастут
уши у этой пpоблемы.

 C наилучшими пожеланиями
                    Ilja aka ИЛ-2  (ilja_vlaskin$mail.ru)

... Опять не сплю, опять пишу

Re: keil C51
Hемедленно нажми на RESET, Sergei Tuchinski!



 ST> Все бы было хорошо, но решил я вместо свитча сделать таблицу
 ST> функций, панимаешь. и натолкнулся на непонятные мне грабли, а
 ST> именно - программа перестала работать правильно. то бишь,
 ST> работать-то она работает, но результаты выдает неверные. таблицу
 ST> описываю следующим образом:

  Хе-хе. Мануал читать пробовал?  Ему нужно ручками, для компоновщика,
прописывать что какая функция какие другие вызывает. Вся суть в
оптимизации -- локальные переменные сохраняются не в стеке,
соответственно компоновщику приходится заниматься распределением памяти.
Компоновщик строит граф вызовов функций для чего. Отследить вызов
функции по указателю не может.

 ST> кроме того, линкер выдает предупредительные сообщения типа

 ST> *** WARNING L13: RECURSIVE CALL TO SEGMENT
 ST>     SEGMENT: ?CO?ADC
 ST>     CALLER:  ?PR?_CREATE_C?ADC

 ST> связанные именно с появлением таблицы
 ST> куды бечь посоветуете?

  Или объявить все функции как recursive. Будет медленно...


keil C51
       Доброго здоровья, Kirill!

25 Oct 04 21:01, Kirill Frolov написал для Sergei Tuchinski:


 ST>> Все бы было хорошо, но решил я вместо свитча сделать таблицу
 ST>> функций, панимаешь. и натолкнулся на непонятные мне грабли, а
 ST>> именно - программа перестала работать правильно. то бишь,
 ST>> работать-то она работает, но результаты выдает неверные. таблицу
 ST>> описываю следующим образом:

 KF>   Хе-хе. Мануал читать пробовал?  Ему нужно ручками, для компоновщика,
 KF> прописывать что какая функция какие другие вызывает. Вся суть в
 KF> оптимизации -- локальные переменные сохраняются не в стеке,
 KF> соответственно компоновщику приходится заниматься распределением памяти.
 KF> Компоновщик строит граф вызовов функций для чего. Отследить вызов
 KF> функции по указателю не может.

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

    WBR, Сергей.                                     ICQ: 101347299


Site Timeline