Перейти к содержанию
    

Как описать большой буфер? килов на 8

Проектируется модуль на базе MSP430F1611, в проце 10 килобайт RAMa.

При создании буфера размером больше 2 килобайт происходит подвисание процессора в процедуре zeromem (это еще до main).

Эта процедура походу внутренняя у сишника, ее кода не видно (если только асмовый).

Пробовал "лечить" директивой __no_init, здесь уже нужно указывать адрес этого буфера (чего делать совершенно не хочится)

Все работало до времени пока не понадобился класс complex

при попытке создать буфер командой

_no_init float_complex[1024] @ 0x1800; // 0x1800 - 0x37FF (8 килобайт, укладываемся)

компиллер пишет ошибку, что типа у данного класса нельзя писать __no_init

без __no_init зависаем в zeromem.

Можно конечно и написать свой, новый, класс complex ...

но хотелось бы по проще

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал простенький тест

#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 работает и не ругается. Нужного кристалла под рукой нет чтобы проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а попробуй так

#pragma location=0x1800

__no_init float_complex buf[1024];

 

в предыдущем моем посте ошибка , если обратить внимание то в записи

_no_init float_complex[1024] @ 0x1800;

нету имени переменной

 

float_complex - имя класса одним словом , НЕ float complex

иначе получится массив типа float

 

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

 

#include <complex>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а попробуй так

#pragma location=0x1800

__no_init float_complex buf[1024];

Не-а, так вообще на объявление ругается.

Извиняюсь, я думал что там ошибочное подчеркивание было.

И вообще если честно, то я не очень знаком с классами и их объявлениями, так что сорри, что встрял :blush:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

float_complex - это какой-то самодельный тип? Я перерыл весь компилятор, все исходники библиотек, но не нашел упоминания "float_complex"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если причиной "подвисания" является сработавший 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

класс float_complex как и double_complex встроенный тип

подключается

#include <complex>

описание встречается в файле

C:\Micro\MSP430\IAR_Ci_3_21\430\inc\dlib\complex

 

на счет int __low_level_init(void);

можно по подробнее как ее подключить?

если просто включить в программу ее текст то она не подцепляется

нужно ее заменить в библиотеке DLIB

т.е. перекомпилировать библиотеку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно! Я не внимательно рыл. Файл без расширения.

 

__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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перекомпилировать библиотеку не надо.

Скопируй файл 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 и все должно заработать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...