Цитата(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