Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема "смещения памяти" Cortex M3
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
AntoXa01
Добрый день
Есть плата 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я функция покаызвает меню (пукнты, которые нужно показать)



внимание, вопрос:
если убрать комментарии с функции - все класс, все работает (но функция-то нигде не вызывается)
если оставить или удалить функцию - сдвиг данных

что делать?
AntoXa01
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";

что это может быть?
codier
Сложно понять по написанному в чём собственно проблема, но подозреваю что вот это
Код
    char VisibleFor: 3;
    unsigned char SubMenuLength: 5;

выравнивается по 4 байтам. т.е. вся структура занимает 21 + 4 байта..
проверьте sizeof(MenuItem)
AntoXa01
нет, проблема не в этом
разделил байт я потом, после выявления этого "феномена"...

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++){

AntoXa01
Все, проблема решена, хоть и не понятно, почему возникла
Код
[b]static const[/b] struct MenuItem menu[] = {
jorikdima
Цитата(AntoXa01 @ Jan 19 2011, 12:25) *
Все, проблема решена, хоть и не понятно, почему возникла
Код
[b]static const[/b] struct MenuItem menu[] = {

Это какое-то замазывание проблемы, а не решение. Попробуйте размер массива до 20 сократить, вместо 21.
codier
Хм.. а смотрели по каким адресам линкуется menu с затычкой ("Ant") и без неё? const заставил запихать данные во флеш, по идее.

Ещё вопрос - что значит сдвигается? Ожидаем что лежит по адресу xxxx0020, а лежит по xxxx0023 ? Смотрели что лежит по ожидаемому адресу?

Ещё идея - может это какой-нить big|little endian? ;-)
AntoXa01
размер буфера с 21 - менял, на 20, 16 - не помогло

смещается - это значит данные лежат в лонгнейм нужные, но начаиная с 5го символа, а 1е 4 - нули
vallav
Цитата(AntoXa01 @ Jan 20 2011, 11:53) *
размер буфера с 21 - менял, на 20, 16 - не помогло

смещается - это значит данные лежат в лонгнейм нужные, но начаиная с 5го символа, а 1е 4 - нули


Может у Вас выравнивание на 8 байт включено?
Адрес то данных выдается правильный ( то есть указывает на данные а не на предшествующие 4 нулевых байта )?
А что там в дампе, дык мало ли чего там в дампе...

Щас оптимизация кода - это не экономия ОЗУ, не экономия флеши, не скорость работы а ЭНЕРГОПОТРЕБЛЕНИЕ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.