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

 
 
 
Reply to this topicStart new topic
> Как описать большой буфер? килов на 8, глюк с зависанием
-=Space=-
сообщение Apr 18 2005, 15:50
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Проектируется модуль на базе MSP430F1611, в проце 10 килобайт RAMa.
При создании буфера размером больше 2 килобайт происходит подвисание процессора в процедуре zeromem (это еще до main).
Эта процедура походу внутренняя у сишника, ее кода не видно (если только асмовый).
Пробовал "лечить" директивой __no_init, здесь уже нужно указывать адрес этого буфера (чего делать совершенно не хочится)
Все работало до времени пока не понадобился класс complex
при попытке создать буфер командой
_no_init float_complex[1024] @ 0x1800; // 0x1800 - 0x37FF (8 килобайт, укладываемся)
компиллер пишет ошибку, что типа у данного класса нельзя писать __no_init
без __no_init зависаем в zeromem.
Можно конечно и написать свой, новый, класс complex ...
но хотелось бы по проще
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 18 2005, 16:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Написал простенький тест
Код
#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 работает и не ругается. Нужного кристалла под рукой нет чтобы проверить.
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Apr 18 2005, 16:37
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



а попробуй так
#pragma location=0x1800
__no_init float_complex buf[1024];

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

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

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

#include <complex>
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 18 2005, 19:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Не-а, так вообще на объявление ругается.
Извиняюсь, я думал что там ошибочное подчеркивание было.
И вообще если честно, то я не очень знаком с классами и их объявлениями, так что сорри, что встрял blush.gif
Go to the top of the page
 
+Quote Post
VAI
сообщение Apr 19 2005, 04:17
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



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


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Kurt
сообщение Apr 19 2005, 04:49
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



Если причиной "подвисания" является сработавший 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.
Go to the top of the page
 
+Quote Post
-=Space=-
сообщение Apr 19 2005, 06:47
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



класс float_complex как и double_complex встроенный тип
подключается
#include <complex>
описание встречается в файле
C:\Micro\MSP430\IAR_Ci_3_21\430\inc\dlib\complex

на счет int __low_level_init(void);
можно по подробнее как ее подключить?
если просто включить в программу ее текст то она не подцепляется
нужно ее заменить в библиотеке DLIB
т.е. перекомпилировать библиотеку?
Go to the top of the page
 
+Quote Post
VAI
сообщение Apr 19 2005, 07:23
Сообщение #8


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



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

__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 ( 227.13 килобайт ) Кол-во скачиваний: 84
 


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Kurt
сообщение Apr 19 2005, 07:25
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



Перекомпилировать библиотеку не надо.
Скопируй файл 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 и все должно заработать.
Go to the top of the page
 
+Quote Post

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

 


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


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