|
Странная проблема с переменными, или как пользоваться volatile |
|
|
|
Aug 6 2008, 13:46
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Чудесным образом портится память. Стал выяснять что же не так и не пойму. Возник вопрос каксающийся volatile. Есть ли разница в следующем и какая? Код typedef struct TSTRUCT { volatile u8 *DATABuff; volatile u8 *CMDBuff; } T_STRUCT;
volatile T_STRUCT STRUCT; и вариант Код typedef struct TSTRUCT { u8 *DATABuff; u8 *CMDBuff; } T_STRUCT;
volatile T_STRUCT STRUCT; Какова будет разница? есть ли тут смысл?
|
|
|
|
|
 |
Ответов
|
Aug 7 2008, 06:29
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Цитата(sigmaN @ Aug 7 2008, 13:20)  Я не пользовался WinAVR, но называется это обычно heap size для кучи и stack size для стека ))
volatile действительно не имеет смысла. Просмотрите внимательно ещё раз весь код. Может быть как-то прогнать пошагово и попытаться определить где именно косяк? для инициализации внешней памяти использую рекомендацию из WinAVR: -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x807FFF т.е. 32к во внешней. Всё остальное не изменно.
|
|
|
|
|
Aug 7 2008, 07:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alexey Belyaev @ Aug 7 2008, 09:29)  т.е. 32к во внешней. Всё остальное не изменно. А не может сбоить сама внешняя память? Попробуйте какой-нибудь тест написать (записать псевдослучайную последовательность и считывать ее в цикле, считая сбои), может программа и не виновата. Цитата(Alexey Belyaev @ Aug 7 2008, 05:06)  :\ А как "железо" может сменить указатель?  Может. Самый простой пример - указатель стека. Более сложный - регистры адреса источника и приемника при ПДП (DMA). Софтовые варианты - указатель изменяется в прерывании. Или еще один случай - многопоточное приложение, доступ к указателю в разных потоках. volatile перед стуктурой распространяет volatile на все члены структуры. Если ни один из этих вариантов не подходит под ваш случай, то вам не нужно делать указатели volatile - этим вы дадите больше свободы оптимизатору, код станет короче и/или быстрее.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 7 2008, 08:16
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Цитата(Сергей Борщ @ Aug 7 2008, 14:46)  А не может сбоить сама внешняя память? Попробуйте какой-нибудь тест написать (записать псевдослучайную последовательность и считывать ее в цикле, считая сбои), может программа и не виновата. Написано, всё ровно. Да и на другой железяке с этой прошивкой точно такие же сбои. Цитата(Сергей Борщ @ Aug 7 2008, 14:46)  Может. Самый простой пример - указатель стека. Более сложный - регистры адреса источника и приемника при ПДП (DMA). Софтовые варианты - указатель изменяется в прерывании. Или еще один случай - многопоточное приложение, доступ к указателю в разных потоках. Ну многопоточность исключена  А по поводу изменения в прерываниях, то тут я уже однажды натыкался, и сейчас если и используется одна и та же переменная как в прерывании, так и в основном коде, то доступ к ней осуществляется только через остановку всех прерываний.
|
|
|
|
Сообщений в этой теме
Alexey Belyaev Странная проблема с переменными Aug 6 2008, 13:46 rezident Разница есть, только смысла в ней нету
А память ... Aug 6 2008, 13:55 Сергей Борщ В первом случае у вас может (неизвестным для компи... Aug 6 2008, 13:58 defunct Цитата(Сергей Борщ @ Aug 6 2008, 16:58) P... Aug 6 2008, 14:17  Alexey Belyaev Цитата(defunct @ Aug 6 2008, 21:17) Автор... Aug 6 2008, 14:25   defunct Цитата(Alexey Belyaev @ Aug 6 2008, 17:25... Aug 6 2008, 14:31    Alexey Belyaev Цитата(defunct @ Aug 6 2008, 21:31) Потом... Aug 7 2008, 02:06 MrYuran данные могут портиться при нарушении выравнивания ... Aug 6 2008, 14:23 SysRq Цитата(defunct @ Aug 6 2008, 18:17) Расск... Aug 7 2008, 02:33 Alexey Belyaev Цитата(SysRq @ Aug 7 2008, 09:33) Цитата(... Aug 7 2008, 04:21  XVR Цитата(Alexey Belyaev @ Aug 7 2008, 08:21... Aug 7 2008, 08:23   Alexey Belyaev Цитата(XVR @ Aug 7 2008, 15:23) Уже произ... Aug 7 2008, 08:40  defunct Цитата(Alexey Belyaev @ Aug 7 2008, 07:21... Aug 7 2008, 10:52   Alexey Belyaev Цитата(defunct @ Aug 7 2008, 17:52) Это п... Aug 7 2008, 11:45    defunct Цитата(Alexey Belyaev @ Aug 7 2008, 14:45... Aug 7 2008, 12:53     Alexey Belyaev Цитата(defunct @ Aug 7 2008, 19:53) Пробл... Aug 7 2008, 13:14      rezident Цитата(Alexey Belyaev @ Aug 7 2008, 19:14... Aug 7 2008, 13:39 Непомнящий Евгений размер кучи достаточен? Куча часом не до стека иде... Aug 7 2008, 05:32 Alexey Belyaev Цитата(Непомнящий Евгений @ Aug 7 2008, 12... Aug 7 2008, 06:03 Alexey Belyaev Ну вот. Не знаю что сделал, но глюк стал стабилен.... Aug 7 2008, 10:36 Alexey Belyaev Ну в общем ситуация такая. Была просадка напряжени... Aug 8 2008, 05:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|