Игорь_Ван 0 16 сентября, 2014 Опубликовано 16 сентября, 2014 · Жалоба День добрый! Вселенская проблема. Имеются две проги, записанные на разных областях флэшки. Первую прогу в проц загружает плиска. В ней происходит инициализация всего-всего и выделен отдельный сектор под загрузчик, который поверх первой проги(но не по верх себя) пишет из другой области флэшки вторую и отдаёт управление на c_int00. Так вот вторя прога не пашет( Однозначно выяснено вторая программа записывается в ОЗУ по верх первой. Более того в main попадание всё-таки есть и в нём могут выполняться команды. Но далее вызов других функции не происходит и всё слетает. В чём проблема может быть и как с ней бороться??? Перед выполнением загрузчика прерывания запрещены. Вероятно что-то с регистрами или с настройками композера. Делал так - сохранял значения регистров А4-А12, В4-В12 в c_int00 первой проги , а затем возвращал значения перед переходом в с_int00 второй проги - не помогает. Значение CSR тоже возвращал. Возможно конечно делал это не правильно.... Заранее спасибо!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 17 сентября, 2014 Опубликовано 17 сентября, 2014 · Жалоба загрузчик, который поверх первой проги(но не по верх себя) пишет из другой области флэшки вторую и отдаёт управление на c_int00. Так вот вторя прога не пашет( Однозначно выяснено вторая программа записывается в ОЗУ по верх первой. Предположительно, самодельный загрузчик не инициализирует переменные, а программа скомпилирована с опцией "load-time autoinitialization", а нужна опция "run-time autoinitialization". Другое предположение - программа собрана с одним мапом, но грузится в другие адреса. И т.д... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edmundo 0 17 сентября, 2014 Опубликовано 17 сентября, 2014 · Жалоба Вторая прога инвалидирует кэш? В одном проекте у нас были прямо магические эффекты, пока не воткнули в самое начало программы инвалидацию кэша. Это связано с тем, что кэш хранит информацию по первой программе в то время, как загружена уже вторая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 сентября, 2014 Опубликовано 17 сентября, 2014 · Жалоба Это связано с тем, что кэш хранит информацию по первой программе в то время, как загружена уже вторая. Ну это, разве что, если в DMA пересылался код, а не средствами ядра процессора... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WitFed 1 17 сентября, 2014 Опубликовано 17 сентября, 2014 · Жалоба Из первого поста ясно, что управление исходниками/компиляцией/зашивкой во флэшь у автора проблемы есть. Тогда можно в любом месте вставить "while (1) ;" зашиться, включиться и подключиться отладчиком к этому ожиданию, там переставить адрес исполнения на следующую строку и наблюдать процессы вживую. Если нарушится что-то таким методом, то использовать "любимые" printf() для локализации -- без них вообще трудно отладиться всегда ;) ...Эта реализация "патчей" к "базовым прошивкам" и многочисленных загрузок-перегрузок, отработка сбоев флэши кого угодно достанет, нет чтобы первая прога из Композера и была единственной у процессора... ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игорь_Ван 0 17 сентября, 2014 Опубликовано 17 сентября, 2014 · Жалоба Предположительно, самодельный загрузчик не инициализирует переменные, а программа скомпилирована с опцией "load-time autoinitialization", а нужна опция "run-time autoinitialization". Другое предположение - программа собрана с одним мапом, но грузится в другие адреса. И т.д... Опции менял - не помогает.. А вот про маппер, если можно по-подробнее. Так всё и происходит, но как с этим бороться? Вторая прога инвалидирует кэш? В одном проекте у нас были прямо магические эффекты, пока не воткнули в самое начало программы инвалидацию кэша. Это связано с тем, что кэш хранит информацию по первой программе в то время, как загружена уже вторая. Не инвалидирует. Нашел функции инвалидации, back write и back write inv . Подскажите пожалуйста какую из трёх использовать и что в аргументах функции писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 сентября, 2014 Опубликовано 17 сентября, 2014 · Жалоба Подскажите пожалуйста какую из трёх использовать и что в аргументах функции писать? В таком случае лучше кэши все поотключать вообще, еще до перехода на вторую софтину. А при старте второй - их заново включить. При таком подходе все что можно и что нельзя инвалидируется само собой, безусловно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edmundo 0 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Не инвалидирует. Нашел функции инвалидации, back write и back write inv . Подскажите пожалуйста какую из трёх использовать и что в аргументах функции писать? Мы использовали функции CSL: #include <csl_cache.h> // В начале memset(0, 0, 0x30000); CACHE_wbInvL1d(0, 0x30000, CACHE_WAIT); CACHE_invAllL1p(); // При копировании секций memcpy((void *) address, src, byteCount); CACHE_wbInvL1d((void *) address, byteCount, CACHE_WAIT); // перед прыжком на старт залитой программы CACHE_wbInvL1d(0, 0x30000, CACHE_WAIT); CACHE_invAllL1p(); У Вас параметры будут, возможно, другие, но суть, думаю, понятна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Игорь_Ван 0 18 сентября, 2014 Опубликовано 18 сентября, 2014 · Жалоба Мы использовали функции CSL: #include <csl_cache.h> // В начале memset(0, 0, 0x30000); CACHE_wbInvL1d(0, 0x30000, CACHE_WAIT); CACHE_invAllL1p(); // При копировании секций memcpy((void *) address, src, byteCount); CACHE_wbInvL1d((void *) address, byteCount, CACHE_WAIT); // перед прыжком на старт залитой программы CACHE_wbInvL1d(0, 0x30000, CACHE_WAIT); CACHE_invAllL1p(); У Вас параметры будут, возможно, другие, но суть, думаю, понятна. СПАСИБО ОГРОМНОЕ!!! Проблема действительно в кэше. Всё заработало! Еще раз спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edmundo 0 19 сентября, 2014 Опубликовано 19 сентября, 2014 · Жалоба СПАСИБО ОГРОМНОЕ!!! Проблема действительно в кэше. Всё заработало! Еще раз спасибо! На здоровье :-) Только я, перечитав первые сообщения, заметил, что я опять все напутал. У нас инвалидирует кэш не вторая программа, а первая, которая заливает вторую. Но Вы, похоже, сами во всем разобрались. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться