Перейти к содержанию
    

tms320c6414

День добрый!

Вселенская проблема.

Имеются две проги, записанные на разных областях флэшки. Первую прогу в проц загружает плиска. В ней происходит инициализация всего-всего и выделен отдельный сектор под загрузчик, который поверх первой проги(но не по верх себя) пишет из другой области флэшки вторую и отдаёт управление на c_int00. Так вот вторя прога не пашет( Однозначно выяснено вторая программа записывается в ОЗУ по верх первой.

Более того в main попадание всё-таки есть и в нём могут выполняться команды. Но далее вызов других функции не происходит и всё слетает.

В чём проблема может быть и как с ней бороться???

Перед выполнением загрузчика прерывания запрещены.

Вероятно что-то с регистрами или с настройками композера. Делал так - сохранял значения регистров А4-А12, В4-В12 в c_int00 первой проги , а затем возвращал значения перед переходом в с_int00 второй проги - не помогает. Значение CSR тоже возвращал. Возможно конечно делал это не правильно....

 

Заранее спасибо!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

загрузчик, который поверх первой проги(но не по верх себя) пишет из другой области флэшки вторую и отдаёт управление на c_int00. Так вот вторя прога не пашет( Однозначно выяснено вторая программа записывается в ОЗУ по верх первой.

Предположительно, самодельный загрузчик не инициализирует переменные, а программа скомпилирована с опцией "load-time autoinitialization", а нужна опция "run-time autoinitialization".

 

Другое предположение - программа собрана с одним мапом, но грузится в другие адреса. И т.д...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вторая прога инвалидирует кэш?

 

В одном проекте у нас были прямо магические эффекты, пока не воткнули в самое начало программы инвалидацию кэша. Это связано с тем, что кэш хранит информацию по первой программе в то время, как загружена уже вторая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это связано с тем, что кэш хранит информацию по первой программе в то время, как загружена уже вторая.

 

Ну это, разве что, если в DMA пересылался код, а не средствами ядра процессора...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из первого поста ясно, что управление исходниками/компиляцией/зашивкой во флэшь у автора проблемы есть.

Тогда можно в любом месте вставить "while (1) ;" зашиться, включиться и подключиться отладчиком к этому ожиданию, там переставить адрес исполнения на следующую строку и наблюдать процессы вживую.

Если нарушится что-то таким методом, то использовать "любимые" printf() для локализации -- без них вообще трудно отладиться всегда ;)

...Эта реализация "патчей" к "базовым прошивкам" и многочисленных загрузок-перегрузок, отработка сбоев флэши кого угодно достанет, нет чтобы первая прога из Композера и была единственной у процессора... ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предположительно, самодельный загрузчик не инициализирует переменные, а программа скомпилирована с опцией "load-time autoinitialization", а нужна опция "run-time autoinitialization".

 

Другое предположение - программа собрана с одним мапом, но грузится в другие адреса. И т.д...

 

Опции менял - не помогает.. А вот про маппер, если можно по-подробнее. Так всё и происходит, но как с этим бороться?

 

 

 

Вторая прога инвалидирует кэш?

 

В одном проекте у нас были прямо магические эффекты, пока не воткнули в самое начало программы инвалидацию кэша. Это связано с тем, что кэш хранит информацию по первой программе в то время, как загружена уже вторая.

 

Не инвалидирует. Нашел функции инвалидации, back write и back write inv . Подскажите пожалуйста какую из трёх использовать и что в аргументах функции писать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста какую из трёх использовать и что в аргументах функции писать?

 

В таком случае лучше кэши все поотключать вообще, еще до перехода на вторую софтину. А при старте второй - их заново включить. При таком подходе все что можно и что нельзя инвалидируется само собой, безусловно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не инвалидирует. Нашел функции инвалидации, 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();

 

У Вас параметры будут, возможно, другие, но суть, думаю, понятна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мы использовали функции 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();

 

У Вас параметры будут, возможно, другие, но суть, думаю, понятна.

 

СПАСИБО ОГРОМНОЕ!!! Проблема действительно в кэше. Всё заработало! Еще раз спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

СПАСИБО ОГРОМНОЕ!!! Проблема действительно в кэше. Всё заработало! Еще раз спасибо!

На здоровье :-)

 

Только я, перечитав первые сообщения, заметил, что я опять все напутал. У нас инвалидирует кэш не вторая программа, а первая, которая заливает вторую. Но Вы, похоже, сами во всем разобрались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...