Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91RM9200 - разбиение кода на быструю и медленную части
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Antokha
Имею в качестве среды среды разработки IAR 5.11 и отладочную плату AS-9200 (Argussoft) + JTAG SAM-ICE. вопрос в следующем:
1. Как содать проект в IAR-e таким образом, что несколько коротких функций (написаны ASM командами и добавлены в проект отдельными файлами) при загрузке были размещены во внутренней SRAM контроллера, а остальные функции (такие как main, функции работы с флешкой AT45DB642D, функции вывода информации на экран, и другие) были размещены в внешней SDRAM.
Функции, которые необходимо размещать в SRAM, критичны к времени выполнения, поэтому и ставиться такая задача. Все функции проекта не умещаются в SRAM. При явном указании размещения функций в файле *.icf файл прошивки контроллера весит свыше 500 мегабайт, что естественно неприемлемо wacko.gif .
Всех участников форума прошу предложить хоть какие-то варианты - мой мозг уже разрывается на куски, мысли закончились.
P.S. Вся прошивка весит где-то 30-50 кБ, поэтому варианты с установкой ОСи (любой) не предлагать - слишком высокая цена получается на реализацию платы (достаточно большое количество SDRAM).
aaarrr
Цитата(Antokha @ Oct 27 2008, 22:43) *
P.S. Вся прошивка весит где-то 30-50 кБ, поэтому варианты с установкой ОСи (любой) не предлагать - слишком высокая цена получается на реализацию платы (достаточно большое количество SDRAM).

Тогда смысла нет задействовать SRAM. Если кэш включен, разницы в скорости Вы, скорее всего, не почувствуете.
sergeeff
И более того, если кеш включен, перепрыгивание между SRAM и SDRAM могут запросто понизить общее быстродействие.
dch
Цитата(sergeeff @ Oct 28 2008, 20:17) *
И более того, если кеш включен

он же не делится если влючен нет внутренней SRAM
aaarrr
Цитата(dch @ Oct 28 2008, 20:40) *
он же не делится если влючен нет внутренней SRAM

Вы путаете, SRAM при включенном кэше никуда не денется.
sergeeff
Цитата(dch @ Oct 28 2008, 21:40) *
он же не делится если влючен нет внутренней SRAM


кеш покрывает все доступное адресное пространство процессора, а какие области делать кешируемые, какие нет - в Translation Table прописывается.
Antokha
Время перепрыгивания из функций SDRAM в функции SRAM мне не важно. Необходимо, чтобы функции расположенные в SRAM выполнялись со стабильной скоростью, которая должна быть не менее предварительной определённой. При отладке этих фунций без остального содержимого программы их выполнение по времени было на грани необходимого для нормальной работы. Надеюсь я понятно выразился. А насчёт кэша идея хорошая - попробую на днях (про Translation Table почитаю в pdf-нике на AT91RM9200).
sergeeff
про Translation Table в pdf-нике на AT91RM9200 ничего нет. Это написано в Technical Reference Manual на ARM920T, например, который можно на сайте ARM найти. Идея добиться стабильной скорости работы процедуры - идея фикс. У вас что, прерываний в системе вообще нет? Даже если вы на время вызова функции сделаете это в критической секции (с запрещенными прерываниями), то даже время запрета прерывания нестабильно по времени.
Antokha
Цитата(sergeeff @ Oct 29 2008, 00:22) *
про Translation Table в pdf-нике на AT91RM9200 ничего нет. Это написано в Technical Reference Manual на ARM920T, например, который можно на сайте ARM найти. Идея добиться стабильной скорости работы процедуры - идея фикс. У вас что, прерываний в системе вообще нет? Даже если вы на время вызова функции сделаете это в критической секции (с запрещенными прерываниями), то даже время запрета прерывания нестабильно по времени.


Насчет pdf спасибо. А скорость выполнения при отладке (загрузка программы через JTAG) стабильная. Если честно я даже забыл прерывания включить. Прерывание наверное будет одно - для USART-a.
singlskv
Цитата(sergeeff @ Oct 28 2008, 21:58) *
кеш покрывает все доступное адресное пространство процессора, а какие области делать кешируемые, какие нет - в Translation Table прописывается.

А какой смысл в кеше на внутреннюю SRAM которая и так full speed ?
aaarrr
Цитата(singlskv @ Oct 29 2008, 01:57) *
А какой смысл в кеше на внутреннюю SRAM которая и так full speed ?

Без кэша будут потеряны преимущества псевдогарвадовости ARM920. Т.е. из внутренней SRAM без кэширования программа будет выполняться медленнее.

Цитата(Antokha @ Oct 28 2008, 23:14) *
Необходимо, чтобы функции расположенные в SRAM выполнялись со стабильной скоростью, которая должна быть не менее предварительной определённой. При отладке этих фунций без остального содержимого программы их выполнение по времени было на грани необходимого для нормальной работы.

Можете залочить их в кэше, тогда гарантированно не будут возникать cache-miss'ы.
dch
Цитата(aaarrr @ Oct 28 2008, 20:56) *
Вы путаете, SRAM при включенном кэше никуда не денется.

точно? а то я начал уже забывать, недавно у меня клиент не смог из u-boot-а стартонуть програмку из внутренней SRAM. Типа написал програмульку, загрузил ее по xмодему - работает, запустил u-boot загрузил по кермиту или както еще в SRAM, дал командочку go - работает, записал во flash, установил командочку загрузить образ из flashа (тоже в SRAM) - не работает, единственное отличие по моей памяти что перед bootm включался кэш (что ядро стартонуло на максимальной скорости) а перед командой go нет. Симптоматика была такая, впрочем надо посмотреть.
aaarrr
Кэш на ARM920 это принадлежность ядра, использовать его в качестве обычной памяти невозможно. SRAM висит отдельно. Так что у Вашего клиента проблема в чем-то еще.
zhz
Цитата(dch @ Oct 29 2008, 12:57) *
точно? а то я начал уже забывать, недавно у меня клиент не смог из u-boot-а стартонуть програмку из внутренней SRAM. Типа написал програмульку, загрузил ее по xмодему - работает, запустил u-boot загрузил по кермиту или както еще в SRAM, дал командочку go - работает, записал во flash, установил командочку загрузить образ из flashа (тоже в SRAM) - не работает, единственное отличие по моей памяти что перед bootm включался кэш (что ядро стартонуло на максимальной скорости) а перед командой go нет. Симптоматика была такая, впрочем надо посмотреть.


Вот и я наступал на эти грабли.
Инвалидить кэш надо при включении в своей программе, чтобы не зависеть от того был включен кеш в bootloader-е или нет.
dch
Цитата(zhz @ Oct 29 2008, 14:48) *
Инвалидить кэш

обычно так и делают когда есть к нему прямой доступ, иногда требуемый кусочек кода переписывают туда при включении, но в u-boot не очень много кода связанного с кэшем, потом после ресета он то, наверное, инвалидный.
По идее так должно быть. У клиента симптоматика была следующая, он дает командочку go - работает, потом кнопочкой ресетит и снова дает go он работает - программка во внутренней ram, потом выключением питания ресетит - там уже срабатывает командочка bootm - не работает. Я тормознулся , напряг память как там сделано - вроде перед bootm он включается да и после включения питания он доложен быть сброшенным.
Antokha
Всем откликнувшимся огромное спасибо!
ИТОГО: прошивку компилить полность в SDRAM, после её запуска (копирования) romboot-ом первыми командами прошивки скопировать вектора из начала прошивки (находящейся в SDRAM), активировать кеши и далее по программе.

Где почитать по Traslation Table? Полазил по форуму ничего что-то не увидел.
sergeeff
Читать тут : http://infocenter.arm.com/help/topic/com.a...920T_TRM1_S.pdf. Раздел 3.3 Address translation.
Antokha
Спасибо за ссылку. Согласно ей в регистр TTB нужно записать указатель на блок в памяти размером в 16 кбайт. Этот блок должен содержать необходимые процедуры, которые я хочу кэшировать. Кроме этого необходимо записать 1 в бит I регистра 1 сопроцессора CP15.
Какие либо ещё действия производить нужно?
На работе есть этот pdf-ник, но этот раздел я пропустил, начал читать почему-то с раздела 4. Решил включить кеш инструкций записью 1 в первый регистр сопроцессора сразу в файле cstartup, но так и не понял какой командой это можно осуществить.
aaarrr
Цитата(Antokha @ Nov 5 2008, 21:23) *
Спасибо за ссылку. Согласно ей в регистр TTB нужно записать указатель на блок в памяти размером в 16 кбайт. Этот блок должен содержать необходимые процедуры, которые я хочу кэшировать.

Этот блок должен содержать таблицу, в которой описывается адресное пространство и типы кэширования.

Цитата(Antokha @ Nov 5 2008, 21:23) *
Кроме этого необходимо записать 1 в бит I регистра 1 сопроцессора CP15.
Какие либо ещё действия производить нужно?

Еще нужно поменять режим тактирования ядра (Synchronous или Asynchronous вместо FastBus), включить DCache и MMU, по желанию включить проверку выравнивания данных.

Цитата(Antokha @ Nov 5 2008, 21:23) *
На работе есть этот pdf-ник, но этот раздел я пропустил, начал читать почему-то с раздела 4. Решил включить кеш инструкций записью 1 в первый регистр сопроцессора сразу в файле cstartup, но так и не понял какой командой это можно осуществить.

Код
        mrc        p15, 0x00, r0, c1, c0, 0x00; read CP15 register 1 into r0
        orr        r0, r0, #(0x01 << 0x0c)    ; enable I Cache
        mcr        p15, 0x00, r0, c1, c0, 0x00; write cp15 register 1

Но одного ICache до обидного мало.
sergeeff
А самое главное, после всего этого at91rm9200, наконец-то заработает на полную мощь!
Antokha
Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM. Вся программа туда не убирается, приходиться кешировать функции (программа при этои запускается из SDRAM). Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM).
sergeeff
Я уже говорил, что "вылизывание" времени выполнения функций - это не вариант. Естъ же таймеры. Кто мешает их запрограммировать на нужную частоту и по прерыванию от таймера нужные функции вызывать? Это и будет правильное решение задачи.
Antokha
Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому. Поэтому в использовании таймеров я не вижу нечего хорошего. В принципе может быть это и правильный подход. Но из-за не всегда одинакового времени входа в прерывание, могут появиться неточности в моментах считывания состояния пина. Этих неточностей у меня и так достаточно по причинам от меня совершенно независящим, но которые мне в программе необходимо минимизировать. Возможно решить проблему компенсации неточностей возможно установкой частоты тактирования периферии 80 МГц, как многие советуют. Но я не нашел допустимых пределов установки этой частоты. Имеющийся .xsl файлик для вычисления значений коэффициентов PLL, а также других делителей при выставлении такого режима выделяет такую частоту красным цветом, что как я понимаю не есть хорошо. Особенно это может сказаться при дальнейшем серийном производстве и при работе в достаточно широком диапазоне температур.

К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял. sad.gif
aaarrr
Цитата(Antokha @ Nov 5 2008, 22:49) *
Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM.
...
Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM).

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

Цитата(Antokha @ Nov 5 2008, 23:53) *
Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому.

А Вы учитывали тот факт, что процессор в режиме FastBus работает на частоте шины?

Цитата(Antokha @ Nov 5 2008, 23:53) *
К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял. sad.gif

Почитайте документ внимательно. Могу выложить пример инициализации на асме, если это облегчит жизнь.
sergeeff
Если сейчас функции работают на пределе необходимой скорости:
1. Выбран не тот процессор.
2. Плохо написаны функции.
3. При правильно инициированных I- и D-cache скорость работы повысится минимум в 3-5 раз.
4. В реально работающей системе скорость работы функции не может быть абсолютно стабильной.
5. Если скорость обработки "впритык", когда же процессор будет делать еще что-то полезное?
Antokha
\
Цитата(sergeeff @ Nov 6 2008, 09:58) *
Если сейчас функции работают на пределе необходимой скорости:
1. Выбран не тот процессор.
2. Плохо написаны функции.
4. В реально работающей системе скорость работы функции не может быть абсолютно стабильной.
5. Если скорость обработки "впритык", когда же процессор будет делать еще что-то полезное?

На момент отладки я кеши не включал, так как не видел необходимости в этом. Скорость обработки почти "впритык", небольшой запас есть (примерно 1-2 команды NOP. ею я релизую задержки,) хотелось бы иметь запас побольше. Во время выполнения этих двух функций контроллеру разрешается выполнение только их и ничего более.
Насчёт пункта 1 - до этого приложение было реализовано на микроконтроллере SX52 фирмы Scenix, без компенсации вышеописанных неточностей его производительности хватало (по сравнению с at91rm9200 он быстрее работает с выводами - быстрее осуществляется и чтение и установка выводов в нужное состояние). Для компенсации неточностей "оцифруемого' сигнала его производительности не хватало, я решил взять что-то побыстрее.
\
Цитата(sergeeff @ Nov 6 2008, 09:58) *
3. При правильно инициированных I- и D-cache скорость работы повысится минимум в 3-5 раз.

Это окрыляет, надеюсь когда я их таки включу так и будет.

Цитата(aaarrr @ Nov 6 2008, 09:08) *
А Вы учитывали тот факт, что процессор в режиме FastBus работает на частоте шины?

Нет не знал, какая имеется в виду частота шины? PCK идущая с выхода PLLA, у меня 179,... МГц, точно не помню.
Цитата(aaarrr @ Nov 6 2008, 09:08) *
Почитайте документ внимательно. Могу выложить пример инициализации на асме, если это облегчит жизнь.

Собственно я не разобрался в следующем:
- что представляют собой ячейки таблицы (я так понял что вроде бы это части абсолютных адресов),
- мне нужно выполнять эти две функции со скоростью не менее чем при отладке во внутренней SRAM с PCK = 179,... МГц.
А насчёт примера это бы очень помогло, если не сильно это вас затруднит.
aaarrr
Цитата(Antokha @ Nov 6 2008, 21:52) *
Насчёт пункта 1 - до этого приложение было реализовано на микроконтроллере SX52 фирмы Scenix, без компенсации вышеописанных неточностей его производительности хватало (по сравнению с at91rm9200 он быстрее работает с выводами - быстрее осуществляется и чтение и установка выводов в нужное состояние). Для компенсации неточностей "оцифруемого' сигнала его производительности не хватало, я решил взять что-то побыстрее.

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

Цитата(Antokha @ Nov 6 2008, 21:52) *
Нет не знал, какая частота шины? PCK идущая с выхода PLLA (у меня 179,... МГц)

Это Master Clock (MCK), обычно PCK/2. PCK без дополнительных телодвижений процессором использоваться не будет.

Цитата(Antokha @ Nov 6 2008, 21:52) *
- что представляют собой ячейки таблицы (я так понял что вроде бы это части абсолютных адресов),

Объяснять "на пальцах" будет долго. Лучше найдите время изучить документацию.

Цитата(Antokha @ Nov 6 2008, 21:52) *
А насчёт примера это бы очень помогло, если не сильно это вас затруднит.

Пожалуйста:
CODE

; ***************************************************************************
; *

ttb_first_level EQU 0xc03fc000


; ***************************************************************************
; * Cache and MMU Configuration

[ {TRUE}
ldr r0, =ttb_first_level ; set start of Translation Table base (16k Boundary)
mcr p15, 0x00, r0, c2, c0, 0x00 ; write to CP15 register 2
;
; Create translation table for flat mapping
; Top 12 bits of VA is pointer into table
; Create 4096 entries from 000xxxxx to fffxxxxx
;
mov r1, #0x00 ; loop counter
ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10)
; set for domain 15 (8:5)
; must be 1 (4)
; set non cachable non bufferable (CB) (3:2)
; set for 1Mb section (1:0)
init_ttb0
orr r3, r2, r1, lsl #0x14
ldr r4, =sections
init_ttb1
ldr r5, [r4], #0x04
tst r5, #0x01
bne init_ttb2
cmp r1, r5, lsr #0x14
addlo r4, r4, #0x08
blo init_ttb1
ldr r5, [r4], #0x04
cmp r1, r5, lsr #0x14
addhs r4, r4, #0x04
bhs init_ttb1
ldr r5, [r4]
orr r3, r3, r5
init_ttb2
str r3, [r0, r1, lsl #0x02]
add r1, r1, #0x01
cmp r1, #0x1000
blo init_ttb0
;
; Init domains
;
mov r0, #(2_01 << 0x1e) ; must define behaviour for domain 15 (31:30), set client
mcr p15, 0x00, r0, c3, c0, 0x00 ; write to CP15 register 5
;
; Set global core configurations
;
mrc p15, 0x00, r0, c1, c0, 0x00 ; read CP15 register 1 into r0

orr r0, r0, #(0x01 << 0x0c) ; enable I Cache
orr r0, r0, #(0x01 << 0x02) ; enable D Cache
orr r0, r0, #(2_11 << 0x1e) ; enable asynchronous clocking mode
orr r0, r0, #0x01 ; enable MMU
;
; Additional configuration options
;
; orr r0, r0, #(0x01 << 0x0e) ; enable Round Robin cache replacement
; orr r0, r0, #(0x01 << 0x0d) ; enable Hi Vectors
orr r0, r0, #(0x01 << 0x01) ; enable data address alignment checking

mcr p15, 0x00, r0, c1, c0, 0x00 ; write cp15 register 1
]

; ***************************************************************************
; *

sections
DCD 0x00000000 ; Flash
DCD 0x00100000
DCD 2_1100 ; wb, buffered

DCD 0xc0000000 ; SDRAM Page 0
DCD 0xc0400000
DCD 2_1100 ; wb, buffered

DCD 0xc4000000 ; SDRAM Page 1
DCD 0xc4400000
DCD 2_0100 ; noncached, buffered

DCD 0xc8000000 ; SDRAM Page 2
DCD 0xc8400000
DCD 2_0100 ; noncached, buffered
; DCD 2_1100 ; wb, buffered

DCD 0xcc000000 ; SDRAM Page 3
DCD 0xcc400000
DCD 2_1100 ; wb, buffered

DCD 0x00000001 ; END

; ***************************************************************************
; *

END

Адреса только переделайте под свою систему.
Antokha
Огромное спасибо за пример.
dch
Вы случайно не внешнее ацп подвесили на этот чудный девайс
Antokha
Цитата(dch @ Nov 7 2008, 18:56) *
Вы случайно не внешнее ацп подвесили на этот чудный девайс

Нет, Я просто так выразился 'оцифровка", на самом деле читается только состояние пина и не более того.
dch
а с каким темпом
Antokha
Цитата(dch @ Nov 7 2008, 19:44) *
а с каким темпом

Для компенсации вышеописанных неточностей с периодом 100 нс.
aaarrr
Разгон процессора может не привести к существенному ускорению опроса пина, т.к. GPIO висит на медленной APB (два такта MCK на доступ).

Еще раз замечу, что такой подход к решению задачи в корне неверен.
Antokha
Цитата(aaarrr @ Nov 7 2008, 22:19) *
Еще раз замечу, что такой подход к решению задачи в корне неверен.

Я алгоритм обработки (оцифровки) сигнала сейчас изменять не могу - попросту не успею (проект надо сдать 21 ноября). Плюс ко всему этот алгоритм обсчитывали статисты, так что сложностей навал cranky.gif . Реализую то, что начальство сказало. maniac.gif
dch
там вроде ножкой невозможно щелкать быстрее чем 5MHz , 100 наносекунд это близко к локаторной дискретизации
Antokha
Цитата(dch @ Nov 9 2008, 22:26) *
там вроде ножкой невозможно щелкать быстрее чем 5MHz , 100 наносекунд это близко к локаторной дискретизации

100 нс получалось ( точно не помню с какими настройками PLL, но с режимом тактирования ядра synchronous)
aaarrr
Цитата(dch @ Nov 9 2008, 22:26) *
там вроде ножкой невозможно щелкать быстрее чем 5MHz , 100 наносекунд это близко к локаторной дискретизации

Щелкать на 5MHz примерно то же самое, что считывать на 10MHz smile.gif

Только вот по моим прикидкам должно получаться быстрее. Впрочем, это уже от программы зависит.
dch
обычно ножки опрашиваются на какойто частоте независимой от pclk и состояние их заносится в соответсвующий регистр, поэтому практически всегда то что вы считали уже не соответсвует действительности
aaarrr
Состояние выводов должно обновляется с частотой MCK (впрочем, может и с MCK/2).
Antokha
To aaarrr:
По поводу кеширования: 1) адреса в разделе sections - это и есть описание адресного пространства (необходимого программе, т.е. фактически ею занимаемого)?
2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до того момента, когда не придет команда lock ICache?
aaarrr
Цитата(Antokha @ Nov 10 2008, 20:36) *
To aaarrr:
По поводу кеширования: 1) адреса в разделе sections - это и есть описание адресного пространства (необходимого программе, т.е. фактически ею занимаемого)?
2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до того момента, когда не придет команда lock ICache?

1. Да. В первом слове хранится адрес начала раздела, во втором - адрес окончания + 1, в третьем - тип кэширования. Всей остальной памяти присваиваются атрибуты noncachable nonbufferable.
2. Да, всё.
Antokha
To aaarrr: Спасибо огромное.
В самом начале кода есть строки:
ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10)
Это загрузка константы записанной по адресу 110111110010 (0xDF2) или здесь должна быть сама константа. Вопрос возник потому, что в первом случае странно хранить константу в памяти, если она используется один раз, кроме, конечно, варианта с наиболее быстрым исполнением этого кода.
dch
Цитата(Antokha @ Nov 10 2008, 20:36) *
2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до

если только выталкивания не призойдет
aaarrr
Цитата(Antokha @ Nov 11 2008, 22:45) *
В самом начале кода есть строки:
ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10)
Это загрузка константы записанной по адресу 110111110010 (0xDF2) или здесь должна быть сама константа.

Это псевдооператор для загрузки длинной константы. Ассемблером трансформируется в инструкцию ldr r2, [PC, #N], по адресу PC+N+8 записана сама константа 0xDF2.
Antokha
To aaarrr: Подправил адреса секций и оформил этот код функцией:
; Set global core configurations
mrc p15, 0x00, r0, c1, c0, 0x00 ; read CP15 register 1 into r0
orr r0, r0, #(0x01 << 0x0c) ; enable I Cache
orr r0, r0, #(0x01 << 0x02) ; enable D Cache
orr r0, r0, #(0x3 << 0x1e) ; enable asynchronous clocking mode
orr r0, r0, #0x01 ; enable MMU
; Additional configuration options
;
; orr r0, r0, #(0x01 << 0x0e) ; enable Round Robin cache replacement
; orr r0, r0, #(0x01 << 0x0d) ; enable Hi Vectors
orr r0, r0, #(0x01 << 0x01) ; enable data address alignment checking
mcr p15, 0x00, r0, c1, c0, 0x00 ; write cp15 register 1 <-------------------------------------
POP {LR}
POP {R7}
POP {R6}
POP {R5}
POP {R4}
POP {R3}
POP {R2}
POP {R1}
POP {R0}

BX LR ;; return
sections // 1
DCD 0x21F00800 ; _SDRAM_READ_ Section 00000000; Flash
DCD 0x21F03FFF ; 00100000
DCD 0xC ; 2_1100 ; wb, buffered
// c03fc000
DCD 0x21F04000 ; c0000000 ; SDRAM Page 0 - _SDRAM_WRITE_ Section
DCD 0x21F04FFF ; c0400000
DCD 0xC ; 2_1100 ; wb, buffered
END

На команде обозначенной стрелкой виснет наглухо. В секции _SDRAM_READ_ размещен участок кода, помеченный в файле *.icf {readonly}, в секции _SDRAM_WRITE_ - соответственно {readwrite}. Почему так? Что я делаю неправильно?
aaarrr
Цитата(Antokha @ Nov 12 2008, 16:00) *
Что я делаю неправильно?


Цитата(Antokha @ Nov 12 2008, 16:00) *
sections // 1
DCD 0x21F00800 ; _SDRAM_READ_ Section 00000000; Flash
DCD 0x21F03FFF ; 00100000
DCD 0xC ; 2_1100 ; wb, buffered
// c03fc000
DCD 0x21F04000 ; c0000000 ; SDRAM Page 0 - _SDRAM_WRITE_ Section
DCD 0x21F04FFF ; c0400000
DCD 0xC ; 2_1100 ; wb, buffered

Здесь выброшен маркер конца таблицы (DCD 0x01), что у Вас в TT оказалось - неизвестно.

Цитата(Antokha @ Nov 12 2008, 16:00) *
POP {LR}
POP {R7}
POP {R6}
POP {R5}
POP {R4}
POP {R3}
POP {R2}
POP {R1}
POP {R0}

Лучше грузить на стек и выгружать регистры скопом, а не по одному.
DamienRice
Привет. На сколько я помню я делал отдельный сегмент кода в внутреней памяти, потом писал к функции приставку - разместить код туда.
Antokha
Цитата(DamienRice @ Nov 12 2008, 17:50) *
Привет. На сколько я помню я делал отдельный сегмент кода в внутреней памяти, потом писал к функции приставку - разместить код туда.

Я уже тоже думаю сделать примерно также. Но вариант с кэшем надо проработать до логического завершенния.
Antokha
Цитата(aaarrr @ Nov 12 2008, 17:07) *
Здесь выброшен маркер конца таблицы (DCD 0x01), что у Вас в TT оказалось - неизвестно.

Другими словами, описания начала и конца сегментов, содержащих весь код программы и лежащих до маркера, недостаточно?
aaarrr
Должно быть:
Цитата
sections // 1
DCD 0x21F00000
DCD 0x21F10000
DCD 0xC ; 2_1100 ; wb, buffered
DCD 0x01

Размер секции должен быть кратен 1Мбайт. Имеет смысл кэшировать всю SDRAM, внутреннюю SRAM и флеш.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.