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

 
 
> 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, 04:16
Сообщение #2


Местный
***

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



Нет во флеше хранить нельзя. Объектный словарь содержит переменные, которые меняются (показания ацп, коэффициенты фильтров настраиваемые пользоваетелем и т.д.).
Integro да массив инициализируется:
Код
CAN_ODENTRY objDic [] =
{
    /* index,             subindex            access_type | length,    value_pointer */
    { 0x1000,            0x00,                OD_EXP_RO    | 4,        (uint8_t *)&deviceType            },
    { 0x1800,            0x02,                OD_EXP_RW    | 4,        (uint8_t *)&transmitionType        },
    { 0x1800,            0x03,                OD_EXP_RW    | 4,        (uint8_t *)&inhibitTime            },

    { SE_1_INDEX,        0x00,                OD_EXP_RO    | 4,        (uint8_t *)&numOfSeSubIndexes    },
    { SE_1_INDEX,        SE_ON_SUBINDEX,        OD_EXP_RW    | 4,        (uint8_t *)&se1Enable            },
    { SE_1_INDEX,        SE_GAIN_SUBINDEX,    OD_EXP_RW    | 4,        (uint8_t *)&se1Gain                },
    { SE_1_INDEX,        SE_CURRENT_OPTION,    OD_EXP_RW    | 4,        (uint8_t *)&se1CurrentOption        },
    { SE_1_INDEX,        SE_SAMPLING_TIME,    OD_EXP_RW    | 4,        (uint8_t *)&se1SamplingTimeUs    },
    { SE_1_INDEX,        USE_IIR_SUBINDEX,    OD_EXP_RW    | 4,        (uint8_t *)&se1UseIir            },
    { SE_1_INDEX,        IIR_A0,            OD_EXP_RW    | 4,        (uint8_t *)&se1A0            },
    { SE_1_INDEX,        IIR_A1,            OD_EXP_RW    | 4,        (uint8_t *)&se1A1            },
    { SE_1_INDEX,        IIR_A2,            OD_EXP_RW    | 4,        (uint8_t *)&se1A2            },
    { SE_1_INDEX,        IIR_A3,            OD_EXP_RW    | 4,        (uint8_t *)&se1A3            },
    { SE_1_INDEX,        IIR_B0,            OD_EXP_RW    | 4,        (uint8_t *)&se1B0            },
    { SE_1_INDEX,        IIR_B1,            OD_EXP_RW    | 4,        (uint8_t *)&se1B1            },
    { SE_1_INDEX,        IIR_B2,            OD_EXP_RW    | 4,        (uint8_t *)&se1B2            },
... и так далее всего 259 элементов.
}

Потом вся эта штука помещается в другую структуру:
Код
CAN_CANOPENCFG canOpenConfigStruct =
{
    1,                                        // node_id
    5,                                        // msgobj_rx
    6,                                        // msgobj_tx
    1,                                        // isr_handled
    sizeof(constObjDic)/sizeof(constObjDic[0]),    // od_const_num
    (CAN_ODCONSTENTRY *)constObjDic,            // od_const_table
    sizeof(objDic)/sizeof(objDic[0]),            // od_num
    (CAN_ODENTRY *)objDic,                    // od_table
};


Последняя структура передается железной API как параметр:
Код
ROM **rom = (ROM **)0x1fff1ff8;
...
(*rom)->pCAND->config_canopen((CAN_CANOPENCFG *)&canOpenConfigStruct);
...

Так вот эта функция вызывает крах программы при вызове, что там внутри происходит отладить возможности нет (во-первых нет отладчика, во вторых она железная, находится где-то внутри проца). Крах появляется, когда общее число элементов в структуре CAN_ODENTRY objDic [] становится больше 243.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 9 2014, 07:18
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(yanvasiij @ Sep 9 2014, 08:16) *
Нет во флеше хранить нельзя. Объектный словарь содержит переменные, которые меняются (показания ацп, коэффициенты фильтров настраиваемые пользоваетелем и т.д.).
Integro да массив инициализируется:
Код
CAN_ODENTRY objDic [] =
{
    /* index,             subindex            access_type | length,    value_pointer */
    { 0x1000,            0x00,                OD_EXP_RO    | 4,        (uint8_t *)&deviceType            },
    { 0x1800,            0x02,                OD_EXP_RW    | 4,        (uint8_t *)&transmitionType        },
    { 0x1800,            0x03,                OD_EXP_RW    | 4,        (uint8_t *)&inhibitTime            },
...
Но я не вижу тут переменных.
Тут лишь указатели на них, а они могут быть константными указателями на переменную:
Код
int var;
int* const ptr = &var;




--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
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   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   Цитата(Dejmos @ Sep 9 2014, 15:57) Keil...   Sep 9 2014, 11:21
|- - Dejmos   Цитата(yanvasiij @ Sep 9 2014, 15:21) каж...   Sep 9 2014, 17:54
|- - 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 - 18:09
Рейтинг@Mail.ru


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