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

 
 
> LPC11C24 проблема с большим массивом, Программа выпадает в hardfault при работе с большим массивом
yanvasiij
сообщение Sep 8 2014, 12:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Доброго времени суток!

Суть проблемы в следующем. Использую проц lpc11c24 и его встроенный CANopen. Для инициализации этого CANopen его железным API нужно передать многомерную структуру, в которой находится объектный словарь устройства:
Код
typedef struct _CAN_ODENTRY {
  uint16_t index;
  uint8_t  subindex;
  uint8_t  entrytype_len;
  uint8_t  *val;
}CAN_ODENTRY;


Мне потребовался очень большой объектный словарь. Он все рос и рос, пока в один определенный момент все не перестало работать. В этот момент общее число членов многомерной структуры превысило 243.
Что делать, а? Пробовал увеличить стек в startup_LPC11xx.s, но при любых увеличениях значения Stack_Size ничего вообще не стартует, а так рушится при инициализации CANopen. Компилятор keil. RTOS в этом проекте не использую. Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
yanvasiij
сообщение Sep 9 2014, 11:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(Dejmos @ Sep 9 2014, 15:57) *
Keil'ом не пользуюсь, но все таки... какое выравнивание задано при объявлении структуры? Если там вдруг 4 байта, то каждый элемент получится по 16 байт, итого у вас массив займет примерно 4кб, что для контроллера с 8кб RAM может быть очень критично.


каждый value_pointer ссылается на 4 байта данных, данных много да, но величина данных на которые ссылается указатель никак не влияет на размер массива указателей. Массив указателей большой (точнее это с структура с указателями, но не суть), это да, данных на которые ссылаются указатели тоже много. Но в память проца все влезает, я проверял. Тем более, что кейл, если не использовать динамическое выделение памяти, сразу выдасть ошибку, если памяти не хватит. Или я чего неправильно понимаю? А вот критично или нет размер массива вот это тот самый вопрос, который меня сейчас занимает. Если да критично, то где про размер этого самого критичного можно почитать?
Go to the top of the page
 
+Quote Post
Dejmos
сообщение Sep 9 2014, 17:54
Сообщение #3


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

Группа: Свой
Сообщений: 100
Регистрация: 4-11-11
Из: Смоленск
Пользователь №: 68 137



Цитата(yanvasiij @ Sep 9 2014, 15:21) *
каждый value_pointer ссылается на 4 байта данных, данных много да, но величина данных на которые ссылается указатель никак не влияет на размер массива указателей. Массив указателей большой (точнее это с структура с указателями, но не суть), это да, данных на которые ссылаются указатели тоже много. Но в память проца все влезает, я проверял. Тем более, что кейл, если не использовать динамическое выделение памяти, сразу выдасть ошибку, если памяти не хватит. Или я чего неправильно понимаю? А вот критично или нет размер массива вот это тот самый вопрос, который меня сейчас занимает. Если да критично, то где про размер этого самого критичного можно почитать?


Я имел в виду то, что каждое поле структуры может занимать по 4 байта.
Попробуйте проверить что выдаст sizeof(CAN_ODENTRY). Если выдаст больше восьми, то попробовать так:

Код
#pragma pack(push,1)
typedef struct _CAN_ODENTRY {
  uint16_t index;
  uint8_t  subindex;
  uint8_t  entrytype_len;
  uint8_t  *val;
}CAN_ODENTRY;
#pragma pack (pop)


P.S. Хотя я упустил один момент - куда эти структуры передаются и сможет ли этот код работать с невыровненной структурой. Но это уже отдельный вопрос.

Сообщение отредактировал Dejmos - Sep 9 2014, 18:06


--------------------
* работаю так, что лошади оборачиваются *
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- yanvasiij   LPC11C24 проблема с большим массивом   Sep 8 2014, 12:57
- - demiurg_spb   Цитата(yanvasiij @ Sep 8 2014, 16:57) А н...   Sep 8 2014, 13:40
|- - Integro   Нужно больше инфы, типовая ошибка при hard_fault э...   Sep 8 2014, 14:05
|- - KRS   Цитата(demiurg_spb @ Sep 8 2014, 17:40) А...   Sep 8 2014, 17:05
- - yanvasiij   Нет во флеше хранить нельзя. Объектный словарь сод...   Sep 9 2014, 04:16
|- - demiurg_spb   Цитата(yanvasiij @ Sep 9 2014, 08:16) Нет...   Sep 9 2014, 07:18
- - yanvasiij   demiurg_spb Справедливое замечание, не подумал об ...   Sep 9 2014, 09:28
|- - demiurg_spb   Цитата(yanvasiij @ Sep 9 2014, 13:28) Нет...   Sep 9 2014, 11:16
- - Dejmos   Keil'ом не пользуюсь, но все таки... какое выр...   Sep 9 2014, 09:57
|- - KRS   Цитата(Dejmos @ Sep 9 2014, 21:54) Я имел...   Sep 9 2014, 20:53
- - yanvasiij   demiurg_spb Освободилось 2072 байт ОЗУ. И это здо...   Sep 9 2014, 11:21
|- - demiurg_spb   Компилятор вам не сможет дать никаких сообщений ес...   Sep 9 2014, 11:30
- - yanvasiij   Цитата(demiurg_spb @ Sep 9 2014, 17:30) К...   Sep 9 2014, 11:50
|- - adnega   Цитата(yanvasiij @ Sep 9 2014, 15:50) Что...   Sep 10 2014, 04:59
- - yanvasiij   Вообщем дело было не в бобине... У этого проца огр...   Sep 12 2014, 12:49


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:37
Рейтинг@Mail.ru


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