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

 
 
 
Reply to this topicStart new topic
> Keil и Si1020 от SiLabs, Непонятные ограничения по объёму кода.
JohnKorsh
сообщение May 28 2013, 12:14
Сообщение #1


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

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Добрый день!
Не поможет ли кто разобраться с Keil mVision? Использую версию 4.14.16.0 с таблеткой.
Целевой микроконтроллер Si1020 от SiLabs (Flash 128 k, RAM 8 k). Язык разработки C.
Пока отлаживал небольшие куски программ - радовался, как удобно. (Скомпилорованный файл - 6 K).
Попробовал подключить FatFS и всё стало плохо - выдаётся ошибка переполнения памяти.
(ERROR L107: ADDRESS SPACE OVERFLOW с последующей
ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT )
Написал тестовую программу и совсем удивился:
Программа 1
Код
const char Test_Array [96] =  // <--- !!!
// По 32 знака в строке.
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// Закоментировал строку.
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
   char n;
   n = Test_Array [1];  // n упомянул, чтобы подлинковать Test_Array
   while (1)
   {
   }                                  // while (1)
}                                    // main ()

Результат компиляции
Код
Build target 'Target 1'
compiling main.c...
linking...
Program Size: data=106.0 xdata=0 code=248
creating hex file from "Test"...
"Test" - 0 Error(s), 0 Warning(s).

Программа 2
Код
const char Test_Array [128] = // <--- !!!
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
   char n;
   n = Test_Array [1];
   while (1)
   {
   }                                  // while (1)
}                                    // main ()
Результат компиляции
Код
Build target 'Target 1'

compiling main.c...
linking...
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE:   DATA        SEGMENT: ?DT?MAIN
LENGTH:  0080H
***
ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  TEST_ARRAY
    SEGMENT: ?DT?MAIN
Program Size: data=138.0 xdata=0 code=280
Target not created

Та же ошибка, что и в моём проекте. (единственнея разница, что у vеня её много - по одной на каждую функцию FatFS) Почему? Ведь в микроконтроллере немеряно памяти для кода, откуда ADDRESS SPACE OVERFLOW ?

Сообщение отредактировал IgorKossak - May 28 2013, 13:48
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 28 2013, 21:28
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



А сколько ноликов в строке? а сколько всего ноликов? А если не указывать размерность массива при инициализации, то может откомпилируется с вашим неправильным количеством ноликов.
Go to the top of the page
 
+Quote Post
VladimirZ
сообщение May 29 2013, 07:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 8-02-05
Из: Харьков
Пользователь №: 2 496



Смотрите в описании к контроллеру Memory Organization, RAM в нём мало, XRAM - поболее.
Go to the top of the page
 
+Quote Post
редактор
сообщение May 29 2013, 08:33
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



в кейле даже const помещается в память по умолчанию (DATA, IDATA, XDATA)
замените const на code, и массив однозначно ляжет во флешь
Если же в процессе работы захотите его отредактировать, тогда укажите паямять xdata (вроде у силабсов около 1К всегда было)
А так да - нехватка ОЗУ в чистом виде.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение May 29 2013, 13:27
Сообщение #5


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

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Спасибо. Понял.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 21:20
Рейтинг@Mail.ru


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