|
|
  |
lowlevel_init, собака много чего неявного делает перед стартом мэйна |
|
|
|
Aug 29 2009, 16:19
|
Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089

|
Цитата(buddazvon @ Aug 24 2009, 17:31)  Есть безосьный элементраный мигатель светодиодами на SAM7S64. Писаный на С. Работающий. Подключаю С++, и линкер вдруг перестает обнаруживать lowlevel_init. Чес гря, я и не полнимал, кто его раньше вызывал, и каким образом соотвтествует С стандарту. IAR "умный" и для "облегчения жизни разработчикам" добавляет собственные хуки и некий инициализирующий код который эти хуки вызывает. lowlevel_init - один из таких хуков те можно описать свою функцию под таким именем и она автоматически позавется перед мэйном он там собака много чего неявного делает перед стартом мэйна, и отключить все это похоже нельзя. иногда это вредно, я уже раз нарвался в результате на 51 пришлось писать на ассемблере, учитывая убогость системы комманд развлечение состоялось  учитывая что с/с++ имеют немного разные способы внутреннего именования, проблемы возможны функа описана в доках - compiler refs /Shu
|
|
|
|
|
Aug 29 2009, 16:32
|

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

|
Цитата(shu123 @ Aug 29 2009, 19:19)  он там собака много чего неявного делает перед стартом мэйна, и отключить все это похоже нельзя. Вообще-то от ровным делом ничего не делает и более того, в нем можно кое-что и запретить. Все это Вы узнаете,если ознакомитесь с "исходником"  Код #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
|
|
|
|
|
Aug 29 2009, 16:49
|
Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089

|
Цитата(zltigo @ Aug 29 2009, 20:32)  Вообще-то от ровным делом ничего не делает и более того, в нем можно кое-что и запретить. Все это Вы узнаете,если ознакомитесь с "исходником"  я для 51-го с этим бодался, там он много чего делает хохма в том, что програмка замечательно работает под всеми возможными симуляторами но не работает на реальном железе (атмеловский 51-й) При применении грубого хака в види ручной правки данного стартапного кода для перехода сразу на мой мэйн на железе работать начинает что-то там не так.... поскольку задачка у меня была простая, я разбираться поленился и закодал все на ассемблере матерясь через каждые пол строчки  но перед этим инициализирующий код таки глянул, ох много всего возможно только для 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-й програмить так что не важно по сути
Сообщение отредактировал shu123 - Aug 29 2009, 16:55
|
|
|
|
|
Aug 29 2009, 16:58
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 29 2009, 17:12
|
Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089

|
Цитата(zltigo @ Aug 29 2009, 20:32)  однако, просто следовало ознакомиться с документацией и тем, как устроен startup код. А рассказывать байки на этом форуме, пожалуйста,не надо. Была бы байка, не рассказывал бы.... не охотничий форум вроде... Есть реальная ситуация проверенная на практике Мне ваш подход не очень понятен... Если у товарища есть проблема значит товарищ просто не ознакомился с доками? Не провел энное количество экспериментов? Не разобрал откуда именно и как именно возникает этот загадочный и мне лично не нужный стартапный код? Который еще и выключить нельзя? Вы так по определению считаете? А просто наличие проблемы вы не предполагаете? Я легко допускаю что это я где-то накосячил, но специально для этого был накатан тест который тупо зажигает лампочку Так вот, на железе он ее зажигает только в том случае, если ручками убить весь этот стартап На симуляторах работает безубойно Не наводит на подозрения? Цитата(zltigo @ Aug 29 2009, 20:58)  Слушаю Вас внимательно, что имено он делает. Вот прямиком default из 51: ну похоже кто-то из нас здесь явно развлекается, допускаю что оба  дискуссия смысла не имеет поскольку мы явно понимаем о чем говорит оппонент, но вот желаем докапаться к словам  дискуссию явно в корзину, поскольку информации почти не содержит тем не менее вопрос он не очень лично для меня критичен поскольку с 51-м я надеюсь больше не столкнусь но может быть полезен для других имею глюк, простейшая сишная прога не работает на реальном 51-м из за (берусь утверждать) именно кода стартапа причем какого-то особого криминала в этом коде я лично не вижу но тем не менее факт налици, при его отключении - работает были похожие проблемы?
Сообщение отредактировал shu123 - Aug 29 2009, 17:19
|
|
|
|
|
Aug 29 2009, 18:18
|
Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089

|
Цитата(zltigo @ Aug 29 2009, 20:58)  Вы говорите неправду я не говорил, это startup - это конкретно тот самы lowlevel_init() о котором Вы не далее, как полчаса назад соизволили написать следующее: я говорю правду  приведенный Вами код стартапом не является? верно ведь? верно именно это я и утверждал а мы говорили однако про стартап код, который похоже иногда по не совсем мне понятным причинам не того...
|
|
|
|
|
Aug 29 2009, 18:39
|

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

|
Цитата(shu123 @ Aug 29 2009, 21:18)  я говорю правду  приведенный Вами код стартапом не является? верно ведь? верно именно это я и утверждал а мы говорили однако про стартап код, который похоже иногда по не совсем мне понятным причинам не того... О чем Вы несли чисто конкретную ахинею про lowlevel_init() в IAR каждый может прочитать несколькими постами выше. На что я конкретно и указал. Точка. Moderator: Продолжать засорять форум флеймом настоятельно не рекомендую.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2009, 19:25
|
Группа: Участник
Сообщений: 5
Регистрация: 29-08-09
Пользователь №: 52 089

|
Цитата(zltigo @ Aug 29 2009, 21:39)  О чем Вы несли чисто конкретную ахинею про lowlevel_init() в IAR каждый может прочитать несколькими постами выше. На что я конкретно и указал. Точка.
Moderator: Продолжать засорять форум флеймом настоятельно не рекомендую. позволю себе таки составить резюме проблемы (флейм правда лишний, тема того не стоит) на этом эту немного бредовую дискуссию предлагаю закончить Я отвечал на вопрос откуда взялся low level init которого никто не звал. Вроде ответил. zltigo внес полезные дополнения к ответу. Все остальное лирика и удовлетворение собственных амбиций модератор: по моему личному мнению вся эта дискуссия в основном к удалению за отсутствием полезной информации. К тому-же не имеет отношения к scmRTOS ///////////// под катом Уточняю, это для IAR для 51. Для avr не смотрел но подозреваю ситуация та-же. Просто для avr все работает и так и нет резонов копать, для 51 лично в моем случае - не работает 1. Стартапный код есть (факт, проверяно) 2. Он много чего делает (тоже факт) 3. В частности он вызывает low lеvеl init (о котором изначально и был вопрос на который я своим первым постом и ответил) 4. Что дефолтный low level init ничего не делает я и сам знаю, но спасибо что вы мне это наглядно показали 5. (не настаиваю) кажется есть проблема именно в этом стартапном коде для 51. Удаление ручками стартапа проблему на железе решило 6. На всяких там симуляторах оба варианта работают замечательно 7. Если вы отказываетесь посмотреть тестовый код в одну строчку и ткнуть меня мордой в ошибку в этой строчке, ну это конечное ваше право  8. Я понимаю что 51 сейчас наверное не очень интересен но мне вот довелось нарваться...  ///////////////// Чтоб не быть совсем голословным позволю себе привести ту единственную строчку в мэйне из которой состоит тестовая програмка сорри, две строчки { P1 = 0x55; // контроллер совершенно тупой, управляет массивом LED for(;;){} } я правда здесь где-то сильно накололся? И *вот это* ухитряется не работать на железе. В симуляторе все ок. Лампочки зажигаются Контроллер AT89C4051 (51-й от atmel) Что хуже всего, при убивани стартапной последовательности ручками (и проверке в дебагере что правдо убилась) оно на железе работает.... Честно светит лампочки через одну Если честно, я немного удивлен /Shu
Сообщение отредактировал shu123 - Aug 29 2009, 20:24
|
|
|
|
|
Aug 29 2009, 22:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(shu123 @ Aug 29 2009, 22:25)  Чтоб не быть совсем голословным позволю себе привести ту единственную строчку в мэйне из которой состоит тестовая програмка сорри, две строчки { P1 = 0x55; // контроллер совершенно тупой, управляет массивом LED for(;;){} } я правда здесь где-то сильно накололся?  Предлягаю модераторам отрезать это обсуждение в отдельную ветку. Вы могли наколоться в файле линкера, разместив стек за пределами реального ОЗУ. Стартап вызывает функции и возвращается из них. В этом коде у вас обращений к стеку нет, весьма вероятно поэтому он и работает. Проверить это можно в симуляторе. Было бы интересно узнать у вас результаты этой проверки. Убрав стартап вы сделали невозможным исполнение любой более сложной программы. Ознакомившись с описанием стартапа вы поймете, что он есть необходимая и нисколько не страшная часть программы. P.S. На этом форуме не любят высказываний "стартап кривой", "компилятор глючит" и т.п. Потому что в 99.9% случаев после опубликования кода кривым оказывается код, а глючит программист из-за недостатка знаний.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 4 2009, 07:19
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(DpInRock @ Sep 3 2009, 22:53)  IAR вам предлагает стартап. Если вы не понимаете, чт он делает - просто не используйте. Все очень просто. Такой подход (неиспользование стартапа) как раз и порождает проблемы. Я бы в данном случае сказал - "Если не понимаете, ничего не трогайте, используйте как есть, по умолчанию, т. е. библиотечный вариант". Ибо если на взгляд топикстартера стартап делает чего-то много, это не значит, что оно лишнее. Цитата(shu123 @ Aug 29 2009, 19:49)  поскольку задачка у меня была простая, я разбираться поленился ... Вот в этом всё и дело. Разбираться поленился. О том, что такое отладка, наверное и не подозревал. Скоропалительный вывод - стартап плохой. Простой совет, выкиньте все свои всевозможные симуляторы и начинайте разбираться с железом, а потом и с программой.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|