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

 
 
 
Reply to this topicStart new topic
> Проблема "смещения памяти" Cortex M3
AntoXa01
сообщение Jan 18 2011, 09:25
Сообщение #1





Группа: Новичок
Сообщений: 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я функция покаызвает меню (пукнты, которые нужно показать)



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

что делать?
Go to the top of the page
 
+Quote Post
AntoXa01
сообщение Jan 18 2011, 14:19
Сообщение #2





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
codier
сообщение Jan 18 2011, 19:42
Сообщение #3


Участник
*

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



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

выравнивается по 4 байтам. т.е. вся структура занимает 21 + 4 байта..
проверьте sizeof(MenuItem)
Go to the top of the page
 
+Quote Post
AntoXa01
сообщение Jan 19 2011, 06:10
Сообщение #4





Группа: Новичок
Сообщений: 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++){

Go to the top of the page
 
+Quote Post
AntoXa01
сообщение Jan 19 2011, 09:25
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574



Все, проблема решена, хоть и не понятно, почему возникла
Код
[b]static const[/b] struct MenuItem menu[] = {
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 19 2011, 09:37
Сообщение #6


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



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

Это какое-то замазывание проблемы, а не решение. Попробуйте размер массива до 20 сократить, вместо 21.
Go to the top of the page
 
+Quote Post
codier
сообщение Jan 19 2011, 16:56
Сообщение #7


Участник
*

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



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

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

Ещё идея - может это какой-нить big|little endian? ;-)

Сообщение отредактировал codier - Jan 19 2011, 16:59
Go to the top of the page
 
+Quote Post
AntoXa01
сообщение Jan 20 2011, 08:53
Сообщение #8





Группа: Новичок
Сообщений: 5
Регистрация: 1-11-10
Пользователь №: 60 574



размер буфера с 21 - менял, на 20, 16 - не помогло

смещается - это значит данные лежат в лонгнейм нужные, но начаиная с 5го символа, а 1е 4 - нули
Go to the top of the page
 
+Quote Post
vallav
сообщение Jan 23 2011, 13:59
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(AntoXa01 @ Jan 20 2011, 11:53) *
размер буфера с 21 - менял, на 20, 16 - не помогло

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


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

Щас оптимизация кода - это не экономия ОЗУ, не экономия флеши, не скорость работы а ЭНЕРГОПОТРЕБЛЕНИЕ.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:03
Рейтинг@Mail.ru


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