-=Space=- 0 18 апреля, 2005 Опубликовано 18 апреля, 2005 · Жалоба Проектируется модуль на базе MSP430F1611, в проце 10 килобайт RAMa. При создании буфера размером больше 2 килобайт происходит подвисание процессора в процедуре zeromem (это еще до main). Эта процедура походу внутренняя у сишника, ее кода не видно (если только асмовый). Пробовал "лечить" директивой __no_init, здесь уже нужно указывать адрес этого буфера (чего делать совершенно не хочится) Все работало до времени пока не понадобился класс complex при попытке создать буфер командой _no_init float_complex[1024] @ 0x1800; // 0x1800 - 0x37FF (8 килобайт, укладываемся) компиллер пишет ошибку, что типа у данного класса нельзя писать __no_init без __no_init зависаем в zeromem. Можно конечно и написать свой, новый, класс complex ... но хотелось бы по проще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 апреля, 2005 Опубликовано 18 апреля, 2005 · Жалоба Написал простенький тест #include <msp430x16x.h> #pragma location=0x1800 __no_init float complex[1024]; void main(void) { unsigned int i; for (i=0;i<1024;i++) { complex[i] = (float)i; } } В симуляторе IAR EW430 3.21A работает и не ругается. Нужного кристалла под рукой нет чтобы проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=Space=- 0 18 апреля, 2005 Опубликовано 18 апреля, 2005 · Жалоба а попробуй так #pragma location=0x1800 __no_init float_complex buf[1024]; в предыдущем моем посте ошибка , если обратить внимание то в записи _no_init float_complex[1024] @ 0x1800; нету имени переменной float_complex - имя класса одним словом , НЕ float complex иначе получится массив типа float да еще нужно написать #include <complex> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 апреля, 2005 Опубликовано 18 апреля, 2005 · Жалоба а попробуй так #pragma location=0x1800 __no_init float_complex buf[1024]; <{POST_SNAPBACK}> Не-а, так вообще на объявление ругается. Извиняюсь, я думал что там ошибочное подчеркивание было. И вообще если честно, то я не очень знаком с классами и их объявлениями, так что сорри, что встрял Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 19 апреля, 2005 Опубликовано 19 апреля, 2005 · Жалоба float_complex - это какой-то самодельный тип? Я перерыл весь компилятор, все исходники библиотек, но не нашел упоминания "float_complex" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kurt 0 19 апреля, 2005 Опубликовано 19 апреля, 2005 · Жалоба Если причиной "подвисания" является сработавший watchdog, то можно сделать так: пристегнуть к проекту файл с функцией int __low_level_init(void); Она вызывается до инициализации сегментов. В ней запретить собаку, настроить порты и т.п., т.е. сделать предварительную инициализацию. Шаблон этой функции лежит в папке IAR файл lowinit.c PS: Про собаку из slau049: Note: Watchdog Timer Powers Up Active After a PUC, the WDT module is automatically configured in the watchdog mode with an initial ~32-ms reset interval using the DCOCLK. The user must setup or halt the WDT prior to the expiration of the initial reset interval. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=Space=- 0 19 апреля, 2005 Опубликовано 19 апреля, 2005 · Жалоба класс float_complex как и double_complex встроенный тип подключается #include <complex> описание встречается в файле C:\Micro\MSP430\IAR_Ci_3_21\430\inc\dlib\complex на счет int __low_level_init(void); можно по подробнее как ее подключить? если просто включить в программу ее текст то она не подцепляется нужно ее заменить в библиотеке DLIB т.е. перекомпилировать библиотеку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 19 апреля, 2005 Опубликовано 19 апреля, 2005 · Жалоба Точно! Я не внимательно рыл. Файл без расширения. __low_level_init Подключается точно так-же как и putchar(): Читаете в "EW430_CompilerReference.pdf" про функцию __low_level_init(), Просто вставляете в свой исходник функцию int __low_level_init(void) { /* Insert your low-level initializations here */ /*==================================*/ /* Choose if segment initialization */ /* should be done or not. */ /* Return: 0 to omit seg_init */ /* 1 to run seg_init */ /*==================================*/ return (1); } Линкер ее подключит вместо пустой библиотечной. На всякий случай прикреплю файл с исходниками библиотек от "3.21 Full Base Line version" - ew430-321a-bl Может кому пригодится. На фтп давно есть. lib.iar.msp.3.21a_bl.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kurt 0 19 апреля, 2005 Опубликовано 19 апреля, 2005 · Жалоба Перекомпилировать библиотеку не надо. Скопируй файл IAR_PATH\430\src\lib\Lowinit.c в папку своего проекта и добавь его "Project\Add files...". Затем отредактируй этот файл: int __low_level_init(void) { /* Insert your low-level initializations here */ WDTCTL = WDTPW+WDTHOLD; /*==================================*/ /* Choose if segment initialization */ /* should be done or not. */ /* Return: 0 to omit seg_init */ /* 1 to run seg_init */ /*==================================*/ return (1); } Затем Rebuild project и все должно заработать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться