Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как описать большой буфер? килов на 8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
-=Space=-
Проектируется модуль на базе 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
Написал простенький тест
Код
#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=-
а попробуй так
#pragma location=0x1800
__no_init float_complex buf[1024];

в предыдущем моем посте ошибка , если обратить внимание то в записи
_no_init float_complex[1024] @ 0x1800;
нету имени переменной

float_complex - имя класса одним словом , НЕ float complex
иначе получится массив типа float

да еще нужно написать

#include <complex>
rezident
Цитата(-=Space=- @ Apr 18 2005, 22:37)
а попробуй так
#pragma location=0x1800
__no_init float_complex buf[1024];
*

Не-а, так вообще на объявление ругается.
Извиняюсь, я думал что там ошибочное подчеркивание было.
И вообще если честно, то я не очень знаком с классами и их объявлениями, так что сорри, что встрял blush.gif
VAI
float_complex - это какой-то самодельный тип? Я перерыл весь компилятор, все исходники библиотек, но не нашел упоминания "float_complex"
Kurt
Если причиной "подвисания" является сработавший 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=-
класс float_complex как и double_complex встроенный тип
подключается
#include <complex>
описание встречается в файле
C:\Micro\MSP430\IAR_Ci_3_21\430\inc\dlib\complex

на счет int __low_level_init(void);
можно по подробнее как ее подключить?
если просто включить в программу ее текст то она не подцепляется
нужно ее заменить в библиотеке DLIB
т.е. перекомпилировать библиотеку?
VAI
Точно! Я не внимательно рыл. Файл без расширения.

__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
Может кому пригодится. На фтп давно есть.
Kurt
Перекомпилировать библиотеку не надо.
Скопируй файл 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 и все должно заработать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.