Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM9260
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
crack_enigma
Всем привет.

Разбираюсь с прерываниями мк AT91SAM9260 IRQ1 и IRQ2. Прошу просто пример кода где они настраиваются и разрешаются. Среда IAR. Язык С.
crack_enigma
Профи, ну помогите!!!!

ниже код (в обработчики прерывания не попадаю)

CODE

void DefInt(); //обработчик прерываний - один на всех пока

extern "C" __irq __arm void IRQ_Handler(void);
extern "C" __irq __arm void FIQ_Handler(void);


int main()
{

//тактирование
//...

//настройка PIO
AT91S_PIO * PIOC = AT91C_BASE_PIOC;
PIOC->PIO_PPUDR = 0xFFFFFFFF;
PIOC->PIO_BSR = bit14|bit15; //IRQ1 IRQ2
PIOC->PIO_PDR = bit14|bit15;

//конфигурирование прерываний
AT91S_AIC * aic_reg = AT91C_BASE_AIC; //регитсры прерываний
AT91_REG * handler = aic_reg->AIC_SVR; //обработчики
AT91_REG * mode = aic_reg->AIC_SMR; //режим работы
AT91_REG * rgIDCR = &(aic_reg->AIC_IDCR); //регистр запрета прерываний
AT91_REG * rgIECR = &(aic_reg->AIC_IECR); //регистр разрешения прерываний
AT91_REG * rgICCR = &(aic_reg->AIC_ICCR); //регистр очистки флага прерываний
AT91_REG * rgISCR = &(aic_reg->AIC_ISCR); // Регистр установки прерываний

*rgIDCR = 0xFFFFFFFF;
*rgICCR = 0xFFFFFFFF;
*rgISCR = 0xFFFFFFFF;

for(int i = 0; i<32; i++){handler[i]= (unsigned int)DefInt;}

*rgIECR = 0xFFFFFFFF;// AIC_IECR

__enable_interrupt(); //разрешить прерывания

//импульсы на входе порта за счёт подтягивающих резисторов
while(1)
{
AT91C_BASE_PIOC-> PIO_PPUER = 0xC000;
for(int i =0; i<100000; i++);
AT91C_BASE_PIOC-> PIO_PPUDR = 0xC000;
for(int i =0; i<100000; i++);
}

return 0;
}


__irq __arm void IRQ_Handler(void)
{
while(1);
}
__irq __arm void FIQ_Handler(void)
{
while(1);
}

void DefInt()
{
while(1);
}

aaarrr
Цитата
импульсы на входе порта за счёт подтягивающих резисторов

Вы уверены, что они физически есть? Pull-down снаружи присутствует?

Цитата
*rgIECR = 0xFFFFFFFF;// AIC_IECR

Не стоит включать все подряд. И способ несколько странный - вместо использования многочисленных указателей можно просто написать *AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2);

Далее - куда Вы хотите попасть, и что написано в стартапе?
crack_enigma
1. Подтягивающие резисторы в самом МК (смотрел осцилографом на выводе импульсы есть)
2. Включать отдельно тоже побывал эффект тод же. ПроСто пытался запустить и RTT и другие потому так и писал.
3. Стартап подпихивает сам IAR (С++ запускает из main). ASM код из отладчика вот
__vector:
__iar_init$$done:
00000000 E59FF018 LDR PC, [PC, #+24] ; RESET [0x20] =__iar_program_start (0x2B4)
00000004 E59FF018 LDR PC, [PC, #+24] ; UND [0x24] =Undefined_Handler (0x228)
00000008 E59FF018 LDR PC, [PC, #+24] ; SWI [0x28] =SWI_Handler (0x22C)
0000000C E59FF018 LDR PC, [PC, #+24] ; P ABT [0x2C] =Prefetch_Handler (0x230)
00000010 E59FF018 LDR PC, [PC, #+24] ; D ABT [0x30] =Abort_Handler (0x234)
__vector_0x14:
00000014 00000000 ANDEQ R0, R0, R0
00000018 E59FF014 LDR PC, [PC, #+20] ; IRQ [0x34] =IRQ_Handler (0x238)
0000001C E59FF014 LDR PC, [PC, #+20] ; FIQ [0x38] =FIQ_Handler (0x23C)

PS: использую J-Link
aaarrr
Цитата(crack_enigma @ Jul 1 2009, 16:26) *
PS: использую J-Link

Тогда посмотрите, что у Вас в AIC_IPR и AIC_CISR. Да, и под отладкой нужно или убрать из окошка регистров AIC_IVR, или использовать Protect Mode.
crack_enigma
изменил код на
CODE

//...
*AT91C_AIC_IDCR = 0xFFFFFFFF;
*AT91C_AIC_ICCR = 0xFFFFFFFF;
for(int i = 0; i<32; i++){ AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int)DefInt;}
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ1] = PRIOR_0|EXT_NEGATIVE_EDGE;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ2] = PRIOR_0|EXT_NEGATIVE_EDGE;
*AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2);
//...


Цитата
что у Вас в AIC_IPR и AIC_CISR

в AIC_IPR 0x00000000
в AIC_CISR (NFIQ == 0 NIRQ == 0)

Цитата
убрать из окошка регистров AIC_IVR

Как это можно cделать ?

Цитата
использовать Protect Mode

Где его включить ?
DpInRock
Поставьте вот это

Код
ldr     PC, [PC,# -0xF20]       ;AIC direct


вместо вот этого в стартапе.

Код
00000018 E59FF014 LDR PC, [PC, #+20]; IRQ [0x34] =IRQ_Handler (0x238)
crack_enigma
Цитата
Поставьте вот это

Код
ldr PC, [PC,# -0xF20] ;AIC direct


А где стартап то лежит? примеры его видел. Но к C++ проекту он подрубается сам.
DpInRock
Вы не в состоянии найти файл на собственном компьютере?
В окошке проекта слева. *.s

Разберитесь конкретно для чего нужен стартап. Там определяются стеки всех режимов, и способы обработки прерываний.
Посмотрите по шагам (без отладчика, а глазами) что делается, когда возникают прерывания. Проследите путь программы и поймете где она оказывается.
А отладчик выбросьте. Тут был спор насколько он полезен... Польза - налицо.

Та строка, что я вам привел заведует выборкой вектора, куда пойдет исполнение в случае прерывания, прямо из регистра AIC.

Пока не разберетесь, не располагайте в обработчике прерываний вызовов других процедур.
crack_enigma
Цитата
В окошке проекта слева. *.s

В проекте при этом ФАЙЛА стартап вообще НЕТ. Вот и вопрос где он если править то его.

Вообще, как я понял, проект С++ IAR 5.20 САМ подпихивает стартап. Для работы энтих векторов достаточно писать:
extern "C" __irq __arm void IRQ_Handler(void);
и потом его реализовать.

Скажем при обращении в память за нужный диапазон в
__irq __arm void Abort_Handler(void)
{
}

замечательно заходит.

Как устроены стартапы тоже смотрел и разбирался.
Ну а для большей понятности ставил точку останова на самом векторе 0x18 и там то он не оказывается.
DpInRock
Так включите.

Extern C - не знаю что это.

Включите в проект вот этот стартап.
Он берет вектора прерываний прямо из AIC.
Убедитесь, что в линкерном файле достаточно стека под все прерывания.
Этот стартап работает исключительно при загрузке в память с адреса 30 0000. Т.е. в неремапленную срам.
И сам ее ремапит. Т.е. из флэшки этот стартап запускать нельзя.
crack_enigma
за стартап H1818_Startup.zip благодарю.

Возник наивный вопрос:
ldr PC,IRQ_Addr ; IRQ
ldr PC, [PC,# -0xF20] ;AIC direct

но тамто должен быть FIQ ?

А проблема решена применением следующего
CODE
__irq __arm void IRQ_Handler(void)
{
uint IVR = * AT91C_AIC_IVR;
uint SPU = * AT91C_AIC_SPU;
if(IVR!=SPU){
void (*interrupt_task)();
interrupt_task = (void(*)())IVR;
(*interrupt_task)();
}
* AT91C_AIC_EOICR = 0xFFFF;
}


При этом в панели регистров лучше не открывать AIC.

А можно -ли как-то исключить из боковой AIC_IVR
те я повторяю вопрос оставленый aaarrr без ответа:

Цитата
Цитата
убрать из окошка регистров AIC_IVR

Как это можно cделать ?

Цитата
Цитата
использовать Protect Mode

Где его включить ?
DpInRock
Код
Возник наивный вопрос:
ldr PC,IRQ_Addr; IRQ
ldr PC, [PC,# -0xF20];AIC direct
но тамто должен быть FIQ ?

Точка с запятой в начале строки означает комментарий. Т.е первая строка закоментирована.

Так работают прерывания с этим стартапом или работают с любым? Или вообще без оного?
crack_enigma
Да а слона( ; ) то я не заметил.

Цитата
Так работают прерывания с этим стартапом или работают с любым? Или вообще без оного?

Работают без него. Просто AIC_IVR считывается отладчиком а в EOICR при этом не чего IAR не пишет. Я понял это так. Вот и вопрос как IAR заставить не считывать энтот регистр.
DpInRock
АРМ - это такая штука, с которой надо разбираться. Выбросьте отладчик. Он вам только вредит. Ей-богу.
Пока вы не прочитаете как вообще происходят прерывания и каким образом они обрабатываются - ничего хорошего не будет.

Возьмите стандартный старап и мой. И на их разнице научитесь. У меня в стартапе - ничего лишнего. Все только по делу. Правда, по моему делу.
aaarrr
Цитата(crack_enigma @ Jul 2 2009, 08:27) *
Как это можно cделать ?

Почитайте хелп ИАР'а.

Цитата(crack_enigma @ Jul 2 2009, 08:27) *
Где его включить ?

Открыть даташит, нажать Ctrl+F, ввести "Protect Mode" и читать.

В общем, читать, читать и еще раз читать. Без этого никак, поверьте.
crack_enigma
Благодарю DpInRock. Перенапраление прерывания с помощью AIC это действительно очень удобно.

Что касается ответа aaarrr
Цитата
Почитайте хелп ИАР'а. и
Открыть дата шит, нажать Ctrl+F, ввести "Protect Mode"...
то можно сказать только следующие:
Всё как в анекдоте про ремонтника где тот берёт 1 фунт за удар молотком а 99 за то что знал куда ударить. По моему профессионал отличается тем что может ткнуть конкретно человека носом "делай вот так" а уже сам человек разберётся спросит уточнит. Ведь не лень писать "Читай ХЕЛП по иару" всесто AAA->BBB->CCC ?
DpInRock
Цитата
Ведь не лень писать "Читай ХЕЛП по иару" всесто AAA->BBB->CCC ?

Видите ли, объяснять то, что человек не понял - нормально. А объяснять то, что человек НЕ ЗНАЕТ - бесполезно.

И несколько нехорошо делать из находящихся тут людей справочники.
crack_enigma
Во первых я ни кого не хочу обидеть, а просто пытаюсь разобраться.

Цитата
Видите ли, объяснять то, что человек не понял - нормально. А объяснять то, что человек НЕ ЗНАЕТ - бесполезно.


Во вторых про защищёны режим вполне мог бы помочь примерчик:
CODE
void main()
{
//...
*AT91C_AIC_DCR = bit0; //Установить защищёный режим
//...
}
//обработчик прерывания при перенаправлении с AIC (ldr PC, [PC,# -0xF20]; в стартапе)
__irq __arm void US0()
{
* AT91C_AIC_IVR = 0xFFFF; //!!! даём знать что это прерывание а не опрос отладчика
//....
* AT91C_AIC_EOICR = 0xFFFF; //конец прерывания
}
aaarrr
Цитата(crack_enigma @ Jul 6 2009, 14:30) *
Во первых я ни кого не хочу обидеть, а просто пытаюсь разобраться.

Чтобы разобраться, достаточно даташита и словосочетания "Protect Mode", не находите?

Цитата(crack_enigma @ Jul 6 2009, 14:30) *
Во вторых про защищёны режим вполне мог бы помочь примерчик:

Ну вот, осилили ведь. А при получении такого "примерчика" со стороны все равно пришлось бы читать даташит.
crack_enigma
Не знаю конечно, правда у каждого своя.

Цитата
Ну вот, осилили ведь. А при получении такого "примерчика" со стороны все равно пришлось бы читать даташит.

А что легче и быстрее идти от рабочего к пониманию или от понимания к реализации?

Цитата
убрать из окошка регистров AIC_IVR...
Почитайте хелп ИАР'а.
Чётка ссылка что и где искать. Он ну очень маленький.

Походу дела возник ещё 1 вопрос:
При использование простого деления в режиме Thumb например:
int A = 123;
A/=12;

вываливатся в SWI_Handel()
А в режиме ARM всё корректно работает

В чем дело?
aaarrr
Цитата(crack_enigma @ Jul 8 2009, 11:52) *
А что легче и быстрее идти от рабочего к пониманию или от понимания к реализации?

От понимания к реализации. И только так.

Цитата(crack_enigma @ Jul 8 2009, 11:52) *
Чётка ссылка что и где искать. Он ну очень маленький.

"Четкие ссылки" спросите у "пацанов на раёне".
crack_enigma
Цитата
"Четкие ссылки" спросите у "пацанов на раёне".

Неужели у вас был на столько горький опыт в жизни? И хорошо вам всё объяснили?

Опять ведь лень было просто написать:
В момент запущенной отладки в IAR : Tools>Options > Register Filter Там можно настроить отображаемые регистры.

А теперь задайте себе вопрос что более информативно приведённый ранее мною примерчик и этот ответ или мысли высказанные вами? Мы всё таки технари по образованию. Если теперь знаю ответ то смог коротко его сформулировать.

У меня есть вопрос, но догадываюсь что ответа на него не последует. Всё же задам:
У AT91SAM9260 есть BootMemory и ROM (32 кб).Возможно ли программу разместить в ROM т.е. не используя внешнею flash, если да то как это реализовать.


BMS =1
настройки *.icf что имеются у меня :
define symbol __ICFEDIT_region_ROM_start__ = 0x80; (побывал 0x100000)
define symbol __ICFEDIT_region_ROM_end__ = 0x107FFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x300000;
define symbol __ICFEDIT_region_RAM_end__ = 0x300FFF;

После сброса питания становится очевидно что программа была в энергозависимой памяти мк.
PS: от туда и ошибка с делением (подрубался лишний код(доб библиотеки IAR), и вылезали за кеш кода в результате младшие адреса с векторами становились не верными.
DpInRock
Цитата
Мы всё таки технари по образованию.

А технарю по образованию знакомо понятие "ROM"? Или тоже надо подробнее, с сылками?
Это означает - память только для чтения.
aaarrr
Цитата(crack_enigma @ Jul 9 2009, 08:56) *
Опять ведь лень было просто написать

Нет, это вам было просто лень разобраться. Когда в Ворде нужно панельки инструментов настроить - тоже задаете вопросы на форумах?

Цитата(crack_enigma @ Jul 9 2009, 08:56) *
У меня есть вопрос, но догадываюсь что ответа на него не последует. Всё же задам:
У AT91SAM9260 есть BootMemory и ROM (32 кб).Возможно ли программу разместить в ROM т.е. не используя внешнею flash, если да то как это реализовать.

Возможно. Другое дело, что для этого придется купить у Атмела кристаллов на много-много K$ и попросить их записать в ROM ваш код.
crack_enigma
Цитата
Возможно. Другое дело, что для этого придется купить у Атмела кристаллов на много-много K$ и попросить их записать в ROM ваш код.

Логично. Благодарю. smile.gif

Смотрел модели со встроенной флешкой в частности AT91SAM9XE512. Сразу возник вопрос:
J-Link + IAR сумеет записать программу сразу в flash и запустить на отладку? Если да то следующий конфиг верен?

REMAP = 0
GPNVMBit[3] = 1

define symbol __ICFEDIT_intvec_start__ = 0x20 0000;
define symbol __ICFEDIT_region_ROM_start__ = 0x20 0080;
define symbol __ICFEDIT_region_ROM_end__ = 0x20 7FFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x300000;
define symbol __ICFEDIT_region_RAM_end__ = 0x307FFF;
crack_enigma
АУУ!!! Люди!!! 1111493779.gif
Уже 4 дня миновало. Может кто нибудь ответит?
defunct
Цитата(crack_enigma @ Jul 13 2009, 12:02) *
Смотрел модели со встроенной флешкой в частности AT91SAM9XE512. Сразу возник вопрос:
J-Link + IAR сумеет записать программу сразу в flash и запустить на отладку?

Думаю без проблем.

Цитата
Если да то следующий конфиг верен?

Адреса выглядят верно, а больше по конфигу ничего сказать не могу.. с IAR'ом не работаю.
В Keil'е загрузка и отладка из флеш на XE512 + J-Link работает прекрасно.
Но, не советую так делать. Когда есть SDRAM лучше грузить и отлаживать в нем. Флеш жалко, уж больно скудный его ресурс, всего 10К перезаписей...
crack_enigma
Благодарю за ответ.

Цитата
Когда есть SDRAM лучше грузить и отлаживать в нем.

Идея очень хорошая. Сразу навела на мысль SDARAM + AT91SAM9260 тогда ведь можно и загрузить в неё? И отлаживать в ней?

Относительно мк AT91SAM9260:
И очень интересует вопрос принципа выполнения программы а именно: при использовании внешней плешки (по SPI) нужен REMAP. 1 раз он делается мк при старте. Далее код проецируется в память. Куда не совсем понял толь на область ROM толь в КЕШ кода. Ну а вот когда этот кусочек программы закончится следующий погрузится сам или это делать приходится программным путём?
aaarrr
Bootloader делает remap, загружает кусок программы в SRAM (она расположена по адресу 0) и передает ей управление. Все остальное - инициализацию кэшей, SDRAM, загрузку остальной программы - нужно делать самостоятельно.
crack_enigma
Благодарю за ответ.

Цитата
Bootloader делает remap, загружает кусок программы в SRAM (она расположена по адресу 0) и передает ей управление. Все остальное - инициализацию кэшей, SDRAM, загрузку остальной программы - нужно делать самостоятельно.


то есть если я правильно понимаю само загрузится из флеши на SPI первые 4 кб ? (с адресов 0х1000 0000 до 0х1000 0000 + 0х1000). На этих 4кнеобходимо настроить тактирование, стеки , и загрузить из флеши в SDRAM какую либо программу (часть данных флеши или всё что там есть). передать управление на неё можно просто вызвав функцию по адресу SDRAM ( 0x2000 0000). ?

Прерывания IRQ идут через AIC по программируемым там адресам (те их можно менять в процессе работы и проблем ссылки на SDRAM не должно быть).

Другие обработчики Прерывания:

__irq __arm void Undefined_Handler(void);
__irq __arm void SWI_Handler(void);.
__irq __arm void Prefetch_Handler(void);
__irq __arm void Abort_Handler(void);

могут быть как в SRAM так и SDRAM.

Но есть 1 НО: SDRAM c адреса 0x2000 0000 если в boot программе из SRAM ссылаться на SDRAM для Undefined_Handler то нужен жесткий адрес по которому располагается этот обработчик. Так вот как IAR заставить его там расположить по требуемому адресу? Или есть более рациональное решение?

Также интересует ситуация: по хорошему boot программа из флеши должна уметь обновлять прошивку основной. При этом процессе может случиться Undefined_Handler и результат плачевен. (ведь в SDRAM пусто - самаписная boot вся в sram). Как разрешить подобную ситуацию?
aaarrr
Цитата(crack_enigma @ Jul 27 2009, 08:54) *
то есть если я правильно понимаю само загрузится из флеши на SPI первые 4 кб ? (с адресов 0х1000 0000 до 0х1000 0000 + 0х1000). На этих 4кнеобходимо настроить тактирование, стеки , и загрузить из флеши в SDRAM какую либо программу (часть данных флеши или всё что там есть). передать управление на неё можно просто вызвав функцию по адресу SDRAM ( 0x2000 0000). ?

Само загрузит столько, сколько пропишите на месте reserved вектора. Но не более, чем физически есть памяти, естественно.
И не с адреса 0х10000000 (откуда вообще эта цифра?), а с 0, т.к. ремап уже сделан.
Управление после загрузки передаете любым способом, можно и вызовом фиктивной функции.


Цитата(crack_enigma @ Jul 27 2009, 08:54) *
Но есть 1 НО: SDRAM c адреса 0x2000 0000 если в boot программе из SRAM ссылаться на SDRAM для Undefined_Handler то нужен жесткий адрес по которому располагается этот обработчик. Так вот как IAR заставить его там расположить по требуемому адресу? Или есть более рациональное решение?

Также интересует ситуация: по хорошему boot программа из флеши должна уметь обновлять прошивку основной. При этом процессе может случиться Undefined_Handler и результат плачевен. (ведь в SDRAM пусто - самаписная boot вся в sram). Как разрешить подобную ситуацию?

Ничего не понял, если честно. Почему так именно Undefined_Handler покоя не дает?
После загрузки, основная программа может совершенно спокойно записать в область векторов что-то свое.

На самом деле, нужно сделать два совершенно раздельных проекта:
1. Boot. Делает минимальную настройку процессора, загружает программу в SDRAM, передает управление.
2. Основная программа. Скомпилирована для работы из SDRAM, содержит отдельный asm-файл с областью векторов, который средствами линкера укладывается по нулевому адресу.
crack_enigma
благодарю за ответ aaarrr. Понимаю всё это с трудом, поэтому если можешь поправь следующие расcуждения:

Цитата
И не с адреса 0х1000 0000 (откуда вообще эта цифра?)

Как я понял (из основного распределения памяти даташита) SPI dataFlash находится по этому адресу. До тех пор пока не будет remp = 0 и BMS = 0. Или я чтото серьёзно путаю?

Цитата
Bootloader делает remap, загружает кусок программы в SRAM (она расположена по адресу 0) и передает ей управление.

Те по сути загружает код из флешь в SRAM1 и remp = 1 . По адресу 0 стала ведь SRAM1. В ней до 4k программы.

сразу вопрос AT45DB161D имеет страницы по 528/512. Загрузится из 1ой первый 512 потом из второй первые 512 итд а оставшиеся 26 в каждой странице для нужд программиста. или будут грузится все 528 байт?

В этом за груженом куске я настраиваю кешь, тактирование.
Цитата
Все остальное - инициализацию кэшей, SDRAM,

Те её нужно ещё настраивать? А defunct советовал отлаживать программу в SDRAM? Поймите меня правильно на той плате что сейчас у меня SDRAM нет (конструктора так постарались), но на следующей версии будет. По этому важно знать можно ли сразу с J-Link будет в неё грузить?

Объём загруженного кода определяется значением что был по 0x14 (RESERVED) в SPI dataFlash

Далее загружаю из ФЛЕШЬ в SDRAM и перехожу на неё вызывая фиктивную функцию.

Цитата
Ничего не понял, если честно. Почему так именно Undefined_Handler покоя не дает?

Он для примера. Просто не хочется остовлять ситуации в которые может попасть процесор и обработчика там не будет. Результат кажется сложно предсказуемым, да и узнать что случилось "именно така" ситуация становится не возможным.

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

каким образом? там ведь выполняемый код? (хоть и перезаписываемый) можно пример?

Прошу извинение за докучливость, но очень нужно разобраться.
aaarrr
Цитата(crack_enigma @ Jul 28 2009, 16:08) *
Как я понял (из основного распределения памяти даташита) SPI dataFlash находится по этому адресу. До тех пор пока не будет remp = 0 и BMS = 0. Или я чтото серьёзно путаю?

SPI DataFlash вообще не может быть отмаплена в адресное пространство. По адресу 0x10000000 расположено пространство нулевого чипселекта параллельной шины.

Цитата(crack_enigma @ Jul 28 2009, 16:08) *
Те по сути загружает код из флешь в SRAM1 и remp = 1 . По адресу 0 стала ведь SRAM1. В ней до 4k программы.

Да.

Цитата(crack_enigma @ Jul 28 2009, 16:08) *
сразу вопрос AT45DB161D имеет страницы по 528/512. Загрузится из 1ой первый 512 потом из второй первые 512 итд а оставшиеся 26 в каждой странице для нужд программиста. или будут грузится все 528 байт?

Хм, никогда не задавался таким вопросом. Но это легко можно проверить.

Цитата(crack_enigma @ Jul 28 2009, 16:08) *
Те её нужно ещё настраивать? А defunct советовал отлаживать программу в SDRAM? Поймите меня правильно на той плате что сейчас у меня SDRAM нет (конструктора так постарались), но на следующей версии будет. По этому важно знать можно ли сразу с J-Link будет в неё грузить?

Инициализировать нужно. Можно сделать это и скриптом при помощи J-Link.

Цитата(crack_enigma @ Jul 28 2009, 16:08) *
каким образом? там ведь выполняемый код? (хоть и перезаписываемый) можно пример?

Какой код? Для стартующей программы там просто такая же память, как и любая другая.
Для IAR'а пример не дам, т.к. им не пользуюсь. Работа со скриптом линкера должна быть описана в документации.
crack_enigma
Цитата
Цитата
сразу вопрос AT45DB161D имеет страницы по 528/512. Загрузится из 1ой первый 512 потом из второй первые 512 итд а оставшиеся 26 в каждой странице для нужд программиста. или будут грузится все 528 байт?

Хм, никогда не задавался таким вопросом. Но это легко можно проверить.

А как?


Цитата
Цитата
каким образом? там ведь выполняемый код? (хоть и перезаписываемый) можно пример?

Какой код? Для стартующей программы там просто такая же память, как и любая другая.
Для IAR'а пример не дам, т.к. им не пользуюсь. Работа со скриптом линкера должна быть описана в документации.

Буду искать данный момент, но в чём сущность этого скрипта? Те как он поможет переместить в момент выполнения в заданные адреса код ? Если есть пример под keil или другую систему тоже поможет (по аналогии легче будет разобраться).
aaarrr
Цитата(crack_enigma @ Jul 28 2009, 16:49) *
А как?

Записать блок Самбой, потом вычитать программой из процессора.

Цитата(crack_enigma @ Jul 28 2009, 16:49) *
Буду искать данный момент, но в чём сущность этого скрипта? Те как он поможет переместить в момент выполнения в заданные адреса код ? Если есть пример под keil или другую систему тоже поможет (по аналогии легче будет разобраться).

Суть в том, что при старте программы отрабатывает библиотечный загрузчик, который распаковывает и копирует секции кода и данных в предназначенные им места и инициализирует секции zero-init (bss/ZI).

Пример для Keil'а:
Код
FLASH 0x00120000 0x00020000
{
    FLASH 0x00100000 0x00020000
    {
        * (startup, +First)
        * (+RO)
    }
    RAM 0x00000000 0x00010000
    {
        vectors.o (vectors, +First)
        * (+RW, +ZI)
    }
}

Здесь все Read Only секции (код, данные) останутся на месте, содержимое файла vectors.s размещено с нулевого адреса RAM, за ним будут расположены RW- и ZI-данные.
DpInRock
Датафлэш работает с 528 байтами. 512 - исключительное и исключительно редкое состояние. И никому не нужное.
--
Насклько я представляю, НИЧЕГО автматически не делается. Никто ничего никуда не размещает. Вернее, размещает, но при компиляции-линковке. И размещает в файле. А дальше - как сам хочешь..
aaarrr
Цитата(DpInRock @ Jul 28 2009, 18:43) *
Датафлэш работает с 528 байтами. 512 - исключительное и исключительно редкое состояние. И никому не нужное.

Это теоретически, или проверяли на самом деле?

Цитата(DpInRock @ Jul 28 2009, 18:43) *
Насклько я представляю, НИЧЕГО автматически не делается. Никто ничего никуда не размещает. Вернее, размещает, но при компиляции-линковке. И размещает в файле. А дальше - как сам хочешь..

Из вашего сообщения НИЧЕГО нельзя понять. О чем речь-то?
DpInRock
Про 528. Это трудно не проверить. Ибо у меня кроме Rs232 никаких других средств нет.
Пишу в датуфлэш секторами по 528. И грузится она замечательно. Вполне вероятно, что загрузчик может легко и сам определить размер сектора и грузить соотвтественно. Ничего ему не мешает.
Но при решении о размере сектора сильное влияние оказал даташит на датуфлэш, который запугал последствиями перехода на 512.


2 А хотел я сказать вот что. Продуктом компиляции является бинарник. Конечным продуктом. И сам себя он не загрузит и не рассует по закоулкам.
aaarrr
Цитата(DpInRock @ Jul 29 2009, 03:19) *
2 А хотел я сказать вот что. Продуктом компиляции является бинарник. Конечным продуктом. И сам себя он не загрузит и не рассует по закоулкам.

Бинарник содержит в себе стандартные средства, которые и загрузят и рассуют все как надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.