|
AT91RM9200 - разбиение кода на быструю и медленную части, SDRAM и внутренняя SRAM |
|
|
|
Oct 27 2008, 19:43
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Имею в качестве среды среды разработки IAR 5.11 и отладочную плату AS-9200 (Argussoft) + JTAG SAM-ICE. вопрос в следующем: 1. Как содать проект в IAR-e таким образом, что несколько коротких функций (написаны ASM командами и добавлены в проект отдельными файлами) при загрузке были размещены во внутренней SRAM контроллера, а остальные функции (такие как main, функции работы с флешкой AT45DB642D, функции вывода информации на экран, и другие) были размещены в внешней SDRAM. Функции, которые необходимо размещать в SRAM, критичны к времени выполнения, поэтому и ставиться такая задача. Все функции проекта не умещаются в SRAM. При явном указании размещения функций в файле *.icf файл прошивки контроллера весит свыше 500 мегабайт, что естественно неприемлемо  . Всех участников форума прошу предложить хоть какие-то варианты - мой мозг уже разрывается на куски, мысли закончились. P.S. Вся прошивка весит где-то 30-50 кБ, поэтому варианты с установкой ОСи (любой) не предлагать - слишком высокая цена получается на реализацию платы (достаточно большое количество SDRAM).
|
|
|
|
|
 |
Ответов
(1 - 51)
|
Oct 28 2008, 20:14
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Время перепрыгивания из функций SDRAM в функции SRAM мне не важно. Необходимо, чтобы функции расположенные в SRAM выполнялись со стабильной скоростью, которая должна быть не менее предварительной определённой. При отладке этих фунций без остального содержимого программы их выполнение по времени было на грани необходимого для нормальной работы. Надеюсь я понятно выразился. А насчёт кэша идея хорошая - попробую на днях (про Translation Table почитаю в pdf-нике на AT91RM9200).
|
|
|
|
|
Oct 28 2008, 21:29
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Цитата(sergeeff @ Oct 29 2008, 00:22)  про Translation Table в pdf-нике на AT91RM9200 ничего нет. Это написано в Technical Reference Manual на ARM920T, например, который можно на сайте ARM найти. Идея добиться стабильной скорости работы процедуры - идея фикс. У вас что, прерываний в системе вообще нет? Даже если вы на время вызова функции сделаете это в критической секции (с запрещенными прерываниями), то даже время запрета прерывания нестабильно по времени. Насчет pdf спасибо. А скорость выполнения при отладке (загрузка программы через JTAG) стабильная. Если честно я даже забыл прерывания включить. Прерывание наверное будет одно - для USART-a.
|
|
|
|
|
Oct 29 2008, 08:29
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(singlskv @ Oct 29 2008, 01:57)  А какой смысл в кеше на внутреннюю SRAM которая и так full speed ? Без кэша будут потеряны преимущества псевдогарвадовости ARM920. Т.е. из внутренней SRAM без кэширования программа будет выполняться медленнее. Цитата(Antokha @ Oct 28 2008, 23:14)  Необходимо, чтобы функции расположенные в SRAM выполнялись со стабильной скоростью, которая должна быть не менее предварительной определённой. При отладке этих фунций без остального содержимого программы их выполнение по времени было на грани необходимого для нормальной работы. Можете залочить их в кэше, тогда гарантированно не будут возникать cache-miss'ы.
|
|
|
|
|
Oct 29 2008, 10:57
|

Профессионал
    
Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661

|
Цитата(aaarrr @ Oct 28 2008, 20:56)  Вы путаете, SRAM при включенном кэше никуда не денется. точно? а то я начал уже забывать, недавно у меня клиент не смог из u-boot-а стартонуть програмку из внутренней SRAM. Типа написал програмульку, загрузил ее по xмодему - работает, запустил u-boot загрузил по кермиту или както еще в SRAM, дал командочку go - работает, записал во flash, установил командочку загрузить образ из flashа (тоже в SRAM) - не работает, единственное отличие по моей памяти что перед bootm включался кэш (что ядро стартонуло на максимальной скорости) а перед командой go нет. Симптоматика была такая, впрочем надо посмотреть.
|
|
|
|
|
Oct 29 2008, 11:48
|

Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 21-03-05
Пользователь №: 3 559

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

Профессионал
    
Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661

|
Цитата(zhz @ Oct 29 2008, 14:48)  Инвалидить кэш обычно так и делают когда есть к нему прямой доступ, иногда требуемый кусочек кода переписывают туда при включении, но в u-boot не очень много кода связанного с кэшем, потом после ресета он то, наверное, инвалидный. По идее так должно быть. У клиента симптоматика была следующая, он дает командочку go - работает, потом кнопочкой ресетит и снова дает go он работает - программка во внутренней ram, потом выключением питания ресетит - там уже срабатывает командочка bootm - не работает. Я тормознулся , напряг память как там сделано - вроде перед bootm он включается да и после включения питания он доложен быть сброшенным.
Сообщение отредактировал dch - Oct 29 2008, 18:21
|
|
|
|
|
Nov 4 2008, 16:44
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Всем откликнувшимся огромное спасибо! ИТОГО: прошивку компилить полность в SDRAM, после её запуска (копирования) romboot-ом первыми командами прошивки скопировать вектора из начала прошивки (находящейся в SDRAM), активировать кеши и далее по программе.
Где почитать по Traslation Table? Полазил по форуму ничего что-то не увидел.
|
|
|
|
|
Nov 5 2008, 18:23
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Спасибо за ссылку. Согласно ей в регистр TTB нужно записать указатель на блок в памяти размером в 16 кбайт. Этот блок должен содержать необходимые процедуры, которые я хочу кэшировать. Кроме этого необходимо записать 1 в бит I регистра 1 сопроцессора CP15. Какие либо ещё действия производить нужно? На работе есть этот pdf-ник, но этот раздел я пропустил, начал читать почему-то с раздела 4. Решил включить кеш инструкций записью 1 в первый регистр сопроцессора сразу в файле cstartup, но так и не понял какой командой это можно осуществить.
|
|
|
|
|
Nov 5 2008, 18:39
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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 до обидного мало.
|
|
|
|
|
Nov 5 2008, 19:49
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM. Вся программа туда не убирается, приходиться кешировать функции (программа при этои запускается из SDRAM). Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM).
Сообщение отредактировал Antokha - Nov 5 2008, 19:54
|
|
|
|
|
Nov 5 2008, 20:53
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому. Поэтому в использовании таймеров я не вижу нечего хорошего. В принципе может быть это и правильный подход. Но из-за не всегда одинакового времени входа в прерывание, могут появиться неточности в моментах считывания состояния пина. Этих неточностей у меня и так достаточно по причинам от меня совершенно независящим, но которые мне в программе необходимо минимизировать. Возможно решить проблему компенсации неточностей возможно установкой частоты тактирования периферии 80 МГц, как многие советуют. Но я не нашел допустимых пределов установки этой частоты. Имеющийся .xsl файлик для вычисления значений коэффициентов PLL, а также других делителей при выставлении такого режима выделяет такую частоту красным цветом, что как я понимаю не есть хорошо. Особенно это может сказаться при дальнейшем серийном производстве и при работе в достаточно широком диапазоне температур. К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял.
|
|
|
|
|
Nov 6 2008, 06:08
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Antokha @ Nov 5 2008, 22:49)  Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM. ... Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM). Расскажите поподробнее об этих двух загадочных функциях, а то есть подозрение, что Вы выбрали не лучший способ решения проблемы. Цитата(Antokha @ Nov 5 2008, 23:53)  Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому. А Вы учитывали тот факт, что процессор в режиме FastBus работает на частоте шины? Цитата(Antokha @ Nov 5 2008, 23:53)  К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял.  Почитайте документ внимательно. Могу выложить пример инициализации на асме, если это облегчит жизнь.
|
|
|
|
|
Nov 6 2008, 18:52
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
\ Цитата(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,... МГц. А насчёт примера это бы очень помогло, если не сильно это вас затруднит.
Сообщение отредактировал Antokha - Nov 6 2008, 19:44
|
|
|
|
|
Nov 6 2008, 19:57
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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
Адреса только переделайте под свою систему.
|
|
|
|
|
Nov 7 2008, 14:21
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Огромное спасибо за пример.
|
|
|
|
|
Nov 7 2008, 16:35
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Цитата(dch @ Nov 7 2008, 18:56)  Вы случайно не внешнее ацп подвесили на этот чудный девайс Нет, Я просто так выразился 'оцифровка", на самом деле читается только состояние пина и не более того.
|
|
|
|
|
Nov 7 2008, 18:58
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Цитата(dch @ Nov 7 2008, 19:44)  а с каким темпом Для компенсации вышеописанных неточностей с периодом 100 нс.
|
|
|
|
|
Nov 7 2008, 19:47
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Цитата(aaarrr @ Nov 7 2008, 22:19)  Еще раз замечу, что такой подход к решению задачи в корне неверен. Я алгоритм обработки (оцифровки) сигнала сейчас изменять не могу - попросту не успею (проект надо сдать 21 ноября). Плюс ко всему этот алгоритм обсчитывали статисты, так что сложностей навал  . Реализую то, что начальство сказало.
|
|
|
|
|
Nov 9 2008, 21:29
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

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

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
To aaarrr: По поводу кеширования: 1) адреса в разделе sections - это и есть описание адресного пространства (необходимого программе, т.е. фактически ею занимаемого)? 2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до того момента, когда не придет команда lock ICache?
Сообщение отредактировал Antokha - Nov 10 2008, 18:01
|
|
|
|
|
Nov 11 2008, 19:45
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
To aaarrr: Спасибо огромное. В самом начале кода есть строки: ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10) Это загрузка константы записанной по адресу 110111110010 (0xDF2) или здесь должна быть сама константа. Вопрос возник потому, что в первом случае странно хранить константу в памяти, если она используется один раз, кроме, конечно, варианта с наиболее быстрым исполнением этого кода.
|
|
|
|
|
Nov 12 2008, 13:00
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
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}. Почему так? Что я делаю неправильно?
|
|
|
|
|
Nov 12 2008, 14:07
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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} Лучше грузить на стек и выгружать регистры скопом, а не по одному.
|
|
|
|
|
Nov 12 2008, 14:50
|
Группа: Новичок
Сообщений: 1
Регистрация: 13-05-08
Пользователь №: 37 480

|
Привет. На сколько я помню я делал отдельный сегмент кода в внутреней памяти, потом писал к функции приставку - разместить код туда.
|
|
|
|
|
Nov 12 2008, 20:15
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

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

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
Цитата(aaarrr @ Nov 12 2008, 17:07)  Здесь выброшен маркер конца таблицы (DCD 0x01), что у Вас в TT оказалось - неизвестно. Другими словами, описания начала и конца сегментов, содержащих весь код программы и лежащих до маркера, недостаточно?
|
|
|
|
|
Nov 13 2008, 16:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(aaarrr @ Nov 13 2008, 11:03)  Должно быть:
Размер секции должен быть кратен 1Мбайт. Имеет смысл кэшировать всю SDRAM, внутреннюю SRAM и флеш. Есть несколько но: 1. Если кешировать флэш, то из программы ничего в нее не запишешь без ухищрений. 2. Если используется DMA, то ее буфера проще организовать в некешируемой области. Таким образом, надо подумать над тем, везде ли включать кеш.
|
|
|
|
|
Nov 13 2008, 17:33
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergeeff @ Nov 13 2008, 19:13)  1. Если кешировать флэш, то из программы ничего в нее не запишешь без ухищрений. Ну, это особый случай, а все "ухищрения" сводятся к отключению кэша на время записи. Цитата(sergeeff @ Nov 13 2008, 19:13)  2. Если используется DMA, то ее буфера проще организовать в некешируемой области. ...а если DMA работает только на вывод, то имеет смысл использовать write-through. Цитата(sergeeff @ Nov 13 2008, 19:13)  Таким образом, надо подумать над тем, везде ли включать кеш. Да, думать нужно всегда
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|