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

 
 
> lowlevel_init, собака много чего неявного делает перед стартом мэйна
buddazvon
сообщение Aug 24 2009, 13:31
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 30-09-08
Пользователь №: 40 575



Цитата(jorikdima @ Aug 24 2009, 14:13) *
Ну и где же были ошибки???

В особенностях дооформления стандартных библиотечных функций.
+ стековые параметры. Всё наложилось друг на друга, и, или не компилилось, или работало неожиданно не так.

Аналогично сейчас.
Есть безосьный элементраный мигатель светодиодами на SAM7S64. Писаный на С. Работающий.
Подключаю С++, и линкер вдруг перестает обнаруживать lowlevel_init. Чес гря, я и не полнимал, кто его раньше вызывал, и каким образом соотвтествует С стандарту.
И таких условиях корректно сформулировать вопрос не всегда получается. И сам ведь не понимаешь, а чем некорректность - база знаний маловата.

ЗЫ
"Берете документ по миграции на V5 и правите." Взял, посмотрел, и, вот как-то усомнился, что, руководствуясь, одним этим документом можно вообще что-то сделать.

нечто по теме:
http://electronix.ru/forum/index.php?showt...t=0#entry557862
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
shu123
сообщение Aug 29 2009, 16:19
Сообщение #2





Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089



Цитата(buddazvon @ Aug 24 2009, 17:31) *
Есть безосьный элементраный мигатель светодиодами на SAM7S64. Писаный на С. Работающий.
Подключаю С++, и линкер вдруг перестает обнаруживать lowlevel_init. Чес гря, я и не полнимал, кто его раньше вызывал, и каким образом соотвтествует С стандарту.


IAR "умный" и для "облегчения жизни разработчикам" добавляет собственные хуки и некий инициализирующий код который эти хуки вызывает.

lowlevel_init - один из таких хуков

те можно описать свою функцию под таким именем и она автоматически позавется
перед мэйном

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

в результате на 51 пришлось писать на ассемблере, учитывая убогость системы комманд развлечение состоялось smile.gif

учитывая что с/с++ имеют немного разные способы внутреннего именования, проблемы возможны
функа описана в доках - compiler refs

/Shu
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2009, 16:32
Сообщение #3


Гуру
******

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



Цитата(shu123 @ Aug 29 2009, 19:19) *
он там собака много чего неявного делает перед стартом мэйна, и отключить все это похоже нельзя.

Вообще-то от ровным делом ничего не делает и более того, в нем можно кое-что и запретить. Все это Вы узнаете,если ознакомитесь с "исходником" smile.gif
Код
#ifdef __cplusplus
extern "C" {
#endif

#pragma language=extended

__interwork int __low_level_init(void);

__interwork int __low_level_init(void)
{
  /*==================================*/
  /*  Initialize hardware.            */
  /*==================================*/

  /*==================================*/
  /* Choose if segment initialization */
  /* should be done or not.           */
  /* Return: 0 to omit seg_init       */
  /*         1 to run seg_init        */
  /*==================================*/
  return 1;
}

#pragma language=default

#ifdef __cplusplus
}
#endif


Цитата(shu123 @ Aug 29 2009, 19:19) *
в результате на 51 пришлось писать на ассемблере...

однако, просто следовало ознакомиться с документацией и тем, как устроен startup код. А рассказывать байки на этом форуме, пожалуйста,не надо.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
shu123
сообщение Aug 29 2009, 16:49
Сообщение #4





Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089



Цитата(zltigo @ Aug 29 2009, 20:32) *
Вообще-то от ровным делом ничего не делает и более того, в нем можно кое-что и запретить. Все это Вы узнаете,если ознакомитесь с "исходником" smile.gif


я для 51-го с этим бодался, там он много чего делает
хохма в том, что програмка замечательно работает под всеми возможными симуляторами но не работает на реальном железе (атмеловский 51-й)

При применении грубого хака в види ручной правки данного стартапного кода для перехода сразу на мой мэйн на железе работать начинает
что-то там не так....

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

основная часть проекта у меня Mega128 пишу на с++ все хорошо



Цитата(zltigo @ Aug 29 2009, 20:32) *
однако, просто следовало ознакомиться с документацией и тем, как устроен startup код. А рассказывать байки на этом форуме, пожалуйста,не надо.


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


Цитата(zltigo @ Aug 29 2009, 20:32) *
ююю
.....
__interwork int __low_level_init(void)
......
однако, просто следовало ознакомиться с документацией и тем, как устроен startup код. А рассказывать байки на этом форуме, пожалуйста,не надо.


с документацией само собой ознакомился...
и не только с документацией, но и с конкретной реализацией данного стартапного кода

то что вами приведено в качестве стартапного кода таковым не является
это всего-лишь описание того самого low level init
точнее его дефолтной болванки

там есть еще стартапный код который все это зовет
и в частности обрабатывает результат возвращаемый low level init (0/1) для того что бы либо заниматься инициализацией сегментов либо нет

а с 51-м там правда проблема какая-то, я надеюсь мне больше не придется 51-й програмить так что не важно по сути smile.gif

Сообщение отредактировал shu123 - Aug 29 2009, 16:55
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2009, 16:58
Сообщение #5


Гуру
******

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



Цитата(shu123 @ Aug 29 2009, 19:41) *
я для 51-го с этим бодался, там он много чего делает

Слушаю Вас внимательно, что имено он делает. Вот прямиком default из 51:
CODE

#ifdef __cplusplus
extern "C" {
#endif

#pragma language=extended

//
// Locate low_level_init in the CSTART module
//
#pragma location="CSTART"
//
// If the code model is banked, low_level_init must be declared
// __near_func elsa a ?BRET is performed
//
#if (__CODE_MODEL__ == 2)
__near_func __root char
#else
__root char
#endif
__low_level_init(void)
{
/*==================================*/
/* Initialize hardware. */
/*==================================*/

/*==================================*/
/* Choose if segment initialization */
/* should be done or not. */
/* Return: 0 to omit seg_init */
/* 1 to run seg_init */
/*==================================*/
return (1);
}

Цитата
могу прислать оригинальный код в личку....

Не надо - это Ваши проблемы, чего Вы там наворотили под "эмулятор".

Цитата(shu123 @ Aug 29 2009, 19:49) *
то что вами приведено в качестве стартапного кода таковым не является

Вы говорите неправду я не говорил, это startup - это конкретно тот самы lowlevel_init() о котором Вы не далее, как полчаса назад соизволили написать следующее:
Цитата
lowlevel_init - один из таких хуков
те можно описать свою функцию под таким именем и она автоматически позавется
перед мэйном
он там собака много чего неявного делает перед стартом мэйна,

И не надо теперь наводить тень на плетень.
P.S.
startup.s точно так-же в исходниках и может быть отредактирован.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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