|
Проблема "смещения памяти" Cortex M3 |
|
|
|
Jan 18 2011, 09:25
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574

|
Добрый день Есть плата LM3S6965 Среда разработки - Eclipse + ARM plugin + GCC Задание: вывести меню на дисплей 4*20 меню хранится так CODE volatile struct MenuItem { char LongName[21]; char VisibleFor: 3; unsigned char SubMenuLength: 5; };
struct MenuItem menu[] = { {" Калибровка ", MENU_VISIBLE_MODE_ALL, 0}, {" Настройки напряж-я ", MENU_VISIBLE_MODE_ALL, 0}, {" Настройка тока ", MENU_VISIBLE_MODE_ALL, 0}, {" Настройка АПВ ", MENU_VISIBLE_MODE_ALL, 0}, {" Настройка АВР ", MENU_VISIBLE_MODE_ALL, 0}, {" Настройка БРУ ", MENU_VISIBLE_MODE_ALL, 0}, {" Настройка Земля ", MENU_VISIBLE_MODE_USER, 0}, {" 8.vendorpass ", MENU_VISIBLE_MODE_VENDOR, 0}, {" 9.userpass 2 ", MENU_VISIBLE_MODE_USER, 0}, {" 10.vendorpass 2 ", MENU_VISIBLE_MODE_VENDOR, 0} }; при отладке данные в этом массиве сдвигаются на 3 байта, непонятно, почему а теперь самое интересное вот фрагмент кода (visible - показывает пункты меню или нет, в зависимости от уровня доступа) CODE void MenuInit(void){ TOTAL_MENU_ITEMS_COUNT = 10; MakeVisibleMenu(mode); }
//void Atas (int i) { //i='A'; //}
void MakeVisibleMenu(char mode) { char i; VISIBLE_MENU_ITEMS_COUNT = -1; 1я функция - инициализация 2я, закомментированная - ничего не делает и нигде не вызывается 3я функция покаызвает меню (пукнты, которые нужно показать) внимание, вопрос: если убрать комментарии с функции - все класс, все работает (но функция-то нигде не вызывается) если оставить или удалить функцию - сдвиг данных что делать?
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Jan 18 2011, 14:19
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574

|
CODE struct MenuItem menu[] = { {"1 ", MENU_VISIBLE_MODE_ALL, 0, 0}, {"2 ", MENU_VISIBLE_MODE_ALL, 0, 0}, {"3 ", MENU_VISIBLE_MODE_USER, 0, 0}, {"4 ", MENU_VISIBLE_MODE_VENDOR, 0, 0} }; вот дамп CODE {{LongName = "\000\000\000\000\061", ' ' <repeats 16 times>, VisibleFor = 0 '\000', SubMenuLength = 4 '\004', SubMenu = 0x300}, {LongName = "\000\000\000\000\062", ' ' <repeats 16 times>, VisibleFor = 0 '\000', SubMenuLength = 4 '\004', SubMenu = 0x300}, {LongName = "\000\000\000\000\063", ' ' <repeats 16 times>, VisibleFor = 0 '\000', SubMenuLength = 4 '\004', SubMenu = 0x100}, {LongName = "\000\000\000\000\064", ' ' <repeats 16 times>, VisibleFor = 0 '\000', SubMenuLength = 4 '\004', SubMenu = 0x200}} о, еще 1 "открыл" если в любой функции вставить массив char 3 элементов - тоже работает напрмер, char a[] = "Ant"; что это может быть?
Сообщение отредактировал AntoXa01 - Jan 18 2011, 13:29
|
|
|
|
|
Jan 18 2011, 19:42
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-01-05
Пользователь №: 2 113

|
Сложно понять по написанному в чём собственно проблема, но подозреваю что вот это Код char VisibleFor: 3; unsigned char SubMenuLength: 5; выравнивается по 4 байтам. т.е. вся структура занимает 21 + 4 байта.. проверьте sizeof(MenuItem)
|
|
|
|
|
Jan 19 2011, 06:10
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574

|
нет, проблема не в этом разделил байт я потом, после выявления этого "феномена"... char i = sizeof (struct MenuItem); и = 22 и опять перестало работать, char a[] = "Ant"; не помогает) Код void MakeVisibleMenu(char mode) { char i = sizeof (struct MenuItem); char a[] = "Ant"; VISIBLE_MENU_ITEMS_COUNT = -1; for (i = 0; i < TOTAL_MENU_ITEMS_COUNT; i++){
|
|
|
|
|
Jan 19 2011, 09:25
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574

|
Все, проблема решена, хоть и не понятно, почему возникла Код [b]static const[/b] struct MenuItem menu[] = {
|
|
|
|
|
Jan 19 2011, 16:56
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 21-01-05
Пользователь №: 2 113

|
Хм.. а смотрели по каким адресам линкуется menu с затычкой ("Ant") и без неё? const заставил запихать данные во флеш, по идее.
Ещё вопрос - что значит сдвигается? Ожидаем что лежит по адресу xxxx0020, а лежит по xxxx0023 ? Смотрели что лежит по ожидаемому адресу?
Ещё идея - может это какой-нить big|little endian? ;-)
Сообщение отредактировал codier - Jan 19 2011, 16:59
|
|
|
|
|
Jan 20 2011, 08:53
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574

|
размер буфера с 21 - менял, на 20, 16 - не помогло
смещается - это значит данные лежат в лонгнейм нужные, но начаиная с 5го символа, а 1е 4 - нули
|
|
|
|
|
Jan 23 2011, 13:59
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(AntoXa01 @ Jan 20 2011, 11:53)  размер буфера с 21 - менял, на 20, 16 - не помогло
смещается - это значит данные лежат в лонгнейм нужные, но начаиная с 5го символа, а 1е 4 - нули Может у Вас выравнивание на 8 байт включено? Адрес то данных выдается правильный ( то есть указывает на данные а не на предшествующие 4 нулевых байта )? А что там в дампе, дык мало ли чего там в дампе... Щас оптимизация кода - это не экономия ОЗУ, не экономия флеши, не скорость работы а ЭНЕРГОПОТРЕБЛЕНИЕ.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|