реклама на сайте
подробности

 
 
> Кэширование записи в RAM в LPC2478?
murug
сообщение Oct 20 2015, 11:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 23-12-10
Пользователь №: 61 816



Собственно при отладке программы наблюдаю спецэффекты, из которых напрашивается вывод о наличии этого самого кэширования. Оно действительно есть? Если да, то где про него почитать?
По ARM Architecture Reference Manual у меня создалось впечатление, что кэш присутствует у процессоров c MMU либо MPU, а разве LPC2478 к таким относится? В user manual'е на сам МК ни слова не нашел про это.

Сообщение отредактировал murug - Oct 20 2015, 11:30
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Oct 20 2015, 11:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



У ARM7TDMI нет ни кэша ни буфера записи.
Go to the top of the page
 
+Quote Post
murug
сообщение Oct 20 2015, 12:34
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 23-12-10
Пользователь №: 61 816



Цитата(aaarrr @ Oct 20 2015, 14:52) *
У ARM7TDMI нет ни кэша ни буфера записи.

Ну я это подозревал. Тогда придется изложить, что же я наблюдаю.

Код такой

В *.h-файле:
Код
__no_init volatile unsigned long ForceReprogrammingSignature @ 0x40008000;


В *.cpp-файле функция:
Код
void ForceReprogramming(bool Monopoly)
{
  ForceReprogrammingSignature = 0x085D0B75;
  
//  asm("nop"); // маленькая задержка в пять ассемблерных команд - если раскомментировать, не помогает (возвращается старое значение)
//  asm("nop");
//  asm("nop");
//  asm("nop");
//  asm("nop");
  
//  volatile unsigned long x = ForceReprogrammingSignature; // чтение (в ассемблере две команды) - если раскомментировать, помогает (сохраняется записанное значение)

//  vTaskDelay(10/portTICK_RATE_MS); // большая задержка в 10 мс - если раскомментировать, помогает (сохраняется записанное значение)

  if (Monopoly)
      __disable_interrupt(); // при Monopoly == true запрещаем прерывания

  PCLKSEL0_bit.PCLK_WDT = 1; // далее взводим WDT
  WDTC = CCLK / 4 * 5;    // на 5 секунд
  WDMOD_bit.WDEN = 1;
  WDMOD_bit.WDRESET = 1;
  WDCLKSEL_bit.WDSEL = 1;
  WDFEED = 0xAA;
  WDFEED = 0x55;

  if (Monopoly) // при Monopoly == true из функции не возвращаемся
      while (1);
}


Так вот, изначально в ForceReprogrammingSignature некое значение, назовем его "старым значением". Далее разные варианты:
1. Вызываем ForceReprogramming(false), она записывает в ForceReprogrammingSignature сигнатуру 0x085D0B75, назовем это "записанное значение", запускает WDT, возвращается, через 5 секунд программа перезапускается, видим в ForceReprogrammingSignature "записанное значение", все ок, вопросов нет.
2. Вызываем ForceReprogramming(true), она записывает в ForceReprogrammingSignature сигнатуру, без задержки запрещает прерывания (тем самым в частности останавливает планировщик FreeRTOS), запускает WDT, виснет в бесконечном цикле, через 5 секунд программа перезапускается, видим в ForceReprogrammingSignature "старое значение", офигеваем.
3. Вызываем ForceReprogramming(true) с раскомментированной задержкой на 10 мс, она записывает в ForceReprogrammingSignature сигнатуру, через 10 мс запрещает прерывания, запускает WDT, виснет в бесконечном цикле, через 5 секунд программа перезапускается, видим в ForceReprogrammingSignature "сохраненное значение".
4. Вызываем ForceReprogramming(true) с закомментированной задержкой на 10 мс, но с раскомментированным чтением, она записывает в ForceReprogrammingSignature сигнатуру, тут же считывает ее (две ассемблерные команды), запускает WDT, виснет в бесконечном цикле, через 5 секунд программа перезапускается, видим в ForceReprogrammingSignature "сохраненное значение".
5. Вызываем ForceReprogramming(true) с закомментированными задержкой на 10 мс и чтением, но с раскомментированной задержкой из пяти nop'ов, она записывает в ForceReprogrammingSignature сигнатуру, выполняет 5 пустых команд, запускает WDT, виснет в бесконечном цикле, через 5 секунд программа перезапускается, видим в ForceReprogrammingSignature "старое значение".

Вот и создается такое впечатление, как будто оператор
Код
ForceReprogrammingSignature = 0x085D0B75;
пишет физически в кэш, и если после этого сразу отключить прерывания, то значение из кэша не успевает сброситься в "настоящий" RAM, поэтому после перезагрузки по WDT снова читаем оттуда старое значение. Звучит бредово, поэтому ищу другую версию )

Сообщение отредактировал murug - Oct 20 2015, 12:56
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 21 2015, 04:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(murug @ Oct 20 2015, 18:34) *
2. Вызываем ForceReprogramming(true), она записывает в ForceReprogrammingSignature сигнатуру, без задержки запрещает прерывания (тем самым в частности останавливает планировщик FreeRTOS), запускает WDT, виснет в бесконечном цикле, через 5 секунд программа перезапускается, видим в ForceReprogrammingSignature "старое значение", офигеваем.

И что?
Очевидно, что startup инитит эту Вашу ForceReprogramming неким значением, либо эта область используется ROM-загрузчиком, либо используется самим startup на какие-то его нужды, ...
Эксперимент проведён некорректно. Читайте юзермануал на предмет: какие области используются ROM-загрузчиком. И ставьте бряк не в функции main(), а сразу после вектора сброса.
Чудес не бывает.
Go to the top of the page
 
+Quote Post
murug
сообщение Oct 21 2015, 05:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 23-12-10
Пользователь №: 61 816



Цитата(jcxz @ Oct 21 2015, 07:36) *
И что?
Очевидно, что startup инитит эту Вашу ForceReprogramming неким значением, либо эта область используется ROM-загрузчиком, либо используется самим startup на какие-то его нужды, ...
Эксперимент проведён некорректно. Читайте юзермануал на предмет: какие области используются ROM-загрузчиком. И ставьте бряк не в функции main(), а сразу после вектора сброса.
Чудес не бывает.

По-моему Вы невнимательно читали. В переменной ForceReprogrammingSignature восстанавливается значение, которое там было до вызова функции ForceReprogramming. Каким бы это значение не было.
Ну и помимо того:
1. переменная помечена __no_init;
2. секция, в которую она помещена, указана для линкера do not initialize;
3. бряк ставил на первые выполняемые ассемблерные команды, уже там видел в отладчике "старое" значение в ForceReprogrammingSignature;
4. пробовал размещать переменную по двум разным адресам, результат один и тот же;
5. ну и в конце концов в случае описанных заплаток-то значение сохраняется.

Цитата(aaarrr @ Oct 20 2015, 23:34) *
Такое не работать просто не может, а в чудеса не очень верится. Что будет, если записать несколько чисел подряд?

Попробую.
Кстати, вспомнил - под отладчиком видел что внутри функции сигнатура 0x085D0B75 в переменную кладется. А вот после перезагрузки в самом начале cstartup.s - уже снова старое значение.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 21 2015, 06:00
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (murug @ Oct 21 2015, 08:55) *
...видел в отладчике "старое" значение в ForceReprogrammingSignature;

То есть весь этот вынос мозга Вы устраиваете по причине того, что сие оказывается "видит" отладчик?!





--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
murug
сообщение Oct 21 2015, 06:09
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 23-12-10
Пользователь №: 61 816



Цитата(zltigo @ Oct 21 2015, 09:00) *
То есть весь этот вынос мозга Вы устраиваете по причине того, что сие оказывается "видит" отладчик?!

Не совсем.
То, что в ячейке "старое" значение, я вижу и без отладчика, но смотрю уже не на этапе выполнения cstartup.s, а после, когда все инициализации прошли и работает графический интерфейс у программы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- murug   Кэширование записи в RAM в LPC2478?   Oct 20 2015, 11:26
||- - aaarrr   Цитата(murug @ Oct 20 2015, 15:34) Вот и ...   Oct 20 2015, 12:58
|||- - murug   Цитата(aaarrr @ Oct 20 2015, 15:58) А Вы ...   Oct 20 2015, 13:12
||- - zltigo   QUOTE (murug @ Oct 21 2015, 09:09) Не сов...   Oct 21 2015, 07:10
||- - murug   Цитата(zltigo @ Oct 21 2015, 10:10) Тем н...   Oct 21 2015, 07:35
||- - aaarrr   Цитата(murug @ Oct 21 2015, 10:35) Попроб...   Oct 21 2015, 07:44
||- - zltigo   QUOTE (murug @ Oct 21 2015, 10:35) Такие ...   Oct 21 2015, 08:11
||- - murug   Цитата(zltigo @ Oct 21 2015, 11:11) Да. Т...   Oct 21 2015, 08:48
||- - aaarrr   Цитата(murug @ Oct 21 2015, 11:48) А что ...   Oct 21 2015, 09:04
||- - zltigo   QUOTE (murug @ Oct 21 2015, 11:48) А така...   Oct 21 2015, 09:13
||- - aaarrr   Цитата(zltigo @ Oct 21 2015, 12:13) Вообщ...   Oct 21 2015, 09:24
|||- - zltigo   QUOTE (aaarrr @ Oct 21 2015, 12:24) Ну, ...   Oct 21 2015, 09:52
|||- - jcxz   Цитата(zltigo @ Oct 21 2015, 15:45) Вообщ...   Oct 21 2015, 09:55
|||- - zltigo   QUOTE (jcxz @ Oct 21 2015, 11:55) Давно у...   Nov 16 2015, 12:13
|||- - jcxz   Цитата(zltigo @ Nov 16 2015, 18:13) Очень...   Nov 16 2015, 13:30
|||- - zltigo   QUOTE (jcxz @ Nov 16 2015, 15:30) Ну или ...   Nov 16 2015, 14:13
|||- - zltigo   QUOTE (jcxz @ Nov 16 2015, 15:30) Так что...   Nov 16 2015, 17:08
|||- - jcxz   Цитата(zltigo @ Nov 16 2015, 23:08) Зашел...   Nov 17 2015, 04:56
|||- - zltigo   QUOTE (jcxz @ Nov 17 2015, 06:56) Ну что ...   Nov 17 2015, 07:55
||- - murug   Цитата(zltigo @ Oct 21 2015, 12:13) Вообщ...   Oct 21 2015, 10:10
|- - GetSmart   Цитата(aaarrr @ Oct 20 2015, 15:52) У ARM...   Nov 16 2015, 02:53
- - aaarrr   Можно все же увидеть листинг? Как-то уж очень чуде...   Oct 20 2015, 13:25
|- - murug   Цитата(aaarrr @ Oct 20 2015, 16:25) Можно...   Oct 20 2015, 14:30
- - aaarrr   Такое не работать просто не может, а в чудеса не о...   Oct 20 2015, 20:34
- - gerber   Классический механизм "posted write" (...   Oct 21 2015, 07:45
|- - murug   Цитата(gerber @ Oct 21 2015, 10:45) Класс...   Oct 21 2015, 08:03
|- - aaarrr   Цитата(murug @ Oct 21 2015, 11:03) Встает...   Oct 21 2015, 08:15
- - gerber   Помимо ядра процессора с памятью может работать и ...   Oct 21 2015, 10:26
|- - aaarrr   Цитата(gerber @ Oct 21 2015, 13:26) А не ...   Oct 21 2015, 10:35
- - zltigo   http://electronix.ru/forum/index.php?showt...=1312...   Oct 24 2015, 16:26
|- - murug   Цитата(zltigo @ Oct 24 2015, 19:26) http:...   Oct 27 2015, 12:22
- - zltigo   Дошли руки. Заплатку на NULL вектор вставил по вар...   Jan 6 2016, 09:51
- - ar__systems   EMCStaticConfig0 bit 19   Feb 2 2016, 23:12
- - zltigo   QUOTE (ar__systems @ Feb 3 2016, 01:12) E...   Feb 2 2016, 23:19
- - ar__systems   Цитата(zltigo @ Feb 2 2016, 18:19) К чему...   Feb 2 2016, 23:39


Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 04:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016