|
LPC11C24 проблема с большим массивом, Программа выпадает в hardfault при работе с большим массивом |
|
|
|
Sep 8 2014, 12:57
|
Местный
  
Группа: Свой
Сообщений: 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 в этом проекте не использую. Спасибо!
|
|
|
|
|
 |
Ответов
|
Sep 9 2014, 11:21
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(Dejmos @ Sep 9 2014, 15:57)  Keil'ом не пользуюсь, но все таки... какое выравнивание задано при объявлении структуры? Если там вдруг 4 байта, то каждый элемент получится по 16 байт, итого у вас массив займет примерно 4кб, что для контроллера с 8кб RAM может быть очень критично. каждый value_pointer ссылается на 4 байта данных, данных много да, но величина данных на которые ссылается указатель никак не влияет на размер массива указателей. Массив указателей большой (точнее это с структура с указателями, но не суть), это да, данных на которые ссылаются указатели тоже много. Но в память проца все влезает, я проверял. Тем более, что кейл, если не использовать динамическое выделение памяти, сразу выдасть ошибку, если памяти не хватит. Или я чего неправильно понимаю? А вот критично или нет размер массива вот это тот самый вопрос, который меня сейчас занимает. Если да критично, то где про размер этого самого критичного можно почитать?
|
|
|
|
|
Sep 9 2014, 17:54
|

Частый гость
 
Группа: Свой
Сообщений: 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
--------------------
* работаю так, что лошади оборачиваются *
|
|
|
|
|
Sep 9 2014, 20:53
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Dejmos @ Sep 9 2014, 21:54)  Я имел в виду то, что каждое поле структуры может занимать по 4 байта. не может! они нормально описаны, выравнивание ничего не даст! Код #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) размер этой структуры при любом выравнивании будет 8 байт
|
|
|
|
Сообщений в этой теме
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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|