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

 
 
> memset не работает, stm32 gcc memset simulink matlab
Brain13
сообщение Jul 26 2011, 12:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Здравствуйте.

Сделал модельку в simulink, cгенерил код, скомпилил на ПК - все работает.
Скомпилил под МК stm32 с помощью codesourcery g++. Компилится без проблем. В функции initialize() для обнуления переменных используется следующий код
Код
  (void) memset(((void *) &newppz_B), 0,
                sizeof(BlockIO_newppz));

...

/* states (dwork) */
  (void) memset((void *)&newppz_DWork, 0,
                sizeof(D_Work_newppz));

  /* external inputs */
  (void) memset((void *)&newppz_U, 0,
                sizeof(ExternalInputs_newppz));

  /* external outputs */
  (void) memset((void *)&newppz_Y, 0,
                sizeof(ExternalOutputs_newppz));


При отладке в момент вызова memset программа уходит в
Код
    .section  .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
  b  Infinite_Loop
  .size  Default_Handler, .-Default_Handler

и остается там навсегда. Прерывания еще не разрешены.
Я предпологаю, что либо memset не существует(но линкер должен выругаться), либо поисходит обращение к несуществующей памяти, хотя адрес(&newppz_B) похож на правду(0x200015dc). Подскажите что не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
Aurochs
сообщение Jul 31 2011, 19:03
Сообщение #2


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



1. Смотрите в карте линковки, куда слинковался memset
2. Пройдитесь отладчиком пошагово на уровне дизассемблера и выясните на какой команде процессор "отлетает"
Go to the top of the page
 
+Quote Post
Brain13
сообщение Aug 1 2011, 05:31
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(Aurochs @ Jul 31 2011, 23:03) *
1. Смотрите в карте линковки, куда слинковался memset
2. Пройдитесь отладчиком пошагово на уровне дизассемблера и выясните на какой команде процессор "отлетает"


Исправил, правда без карты линковки и дизассемблера(но надо будет все равно еще посмотреть что же это было).
Ситуация такова:
Код на самом деле такой:
CODE

void newppzModelClass::initialize()
{
/* Registration code */

/* initialize error status */
rtmSetErrorStatus(newppz_M, (NULL));

/* block I/O */
(void) memset(((void *) &newppz_B), 0,
sizeof(BlockIO_newppz));

{
newppz_B.DiscreteTimeIntegrator = newppz_sfix64_GND;
newppz_B.DiscreteTimeIntegrator1 = newppz_sfix64_GND;
newppz_B.DiscreteTimeIntegrator2 = newppz_sfix64_GND;
}

/* states (dwork) */
(void) memset((void *)&newppz_DWork, 0,
sizeof(D_Work_newppz));

/* external inputs */
(void) memset((void *)&newppz_U, 0,
sizeof(ExternalInputs_newppz));

/* external outputs */
(void) memset((void *)&newppz_Y, 0,
sizeof(ExternalOutputs_newppz));

...
}


Так вот вылетает не при вызове memset, а после вызова rtmSetErrorStatus О_о. Но я посмотрел, что данная функция меняет статус флага Error, который нигде больше не используется. Если закомментить rtmSetErrorStatus прога выполняется нормально.

P.S.: На самом деле не нормально(немного оффтопа). Я использую CodeSourcery G++ и использую его стартап файл. Там нет вызова инициализации начальных значений переменных. Так как все параметры модели инициализируются в конструкторе класса, а он не вызывается, то все константы, коэффициенты усиления и прочее равны нулю(хотя может быть заполнены мусором). Лечится добавлением строки
Код
bl __libc_init_array

между этих строк
Код
bl  SystemInit
bl  main

Скрипт линкера править не надо, он вроде нормальный.
В итоге, имеем рабочую модель.

Надеюсь кому-нибудь поможет.

Сообщение отредактировал Brain13 - Aug 1 2011, 05:39
Go to the top of the page
 
+Quote Post

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

 


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


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