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

 
 
> Чтение бинарного файла в проэкт TI C5402, Происходит бардак - помогите разобраться...
Саша Z
сообщение May 29 2007, 13:40
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Вроде элементарная вещь - читаю бинарный файл в память C5402, элементарный код, а виснет ...
Код:
Код
#include <stdio.h>
#include <stdlib.h>


void f_write(char *str,int arr[],int N);
void f_read(char *str,int arr[],int N);

int z1[1000],Nfloat;

void main()
{ int i;

char str1[]="C:\\Ti\\myprojects\\Project\\Project\\zoom_inst1";
char str2[]="C:\\Ti\\myprojects\\Project\\Project\\zoom_inst1_out";


for (i=0;i<1000;i++)
    z1[i]=0;

puts("start");
f_read(str1,z1,1000);

f_write(str2,z1,1000);
puts("end");
}
            
void f_read(char *str,int arr[],int N )    
{
      FILE  *fr;
      fr = fopen(str,"rb");
      fseek(fr, 0, 0);                          
      fread(arr,1,N,fr);
      fclose(fr);
}
void f_write(char *str,int arr[],int N)  
{
    FILE  *fw;
    fw = fopen(str, "wb");
    fwrite(arr,1,N,fw);
    fclose(fw);
}


Бинарный файл содержит 5800 последовательных байт (2900 integres), в коде проведенном выше - читаю первых 1000 байт а массив z1 (массив заявлен как integer).
На данный момент работаю на симуятор C5402 (т.е. без подключенного борта).
В таком состоянии (чтение 1000 байт) - вроде работает нормально, данные читаются в массив z1.

Задача - прочесть все 5800 байт из исходного файла. Проблема возникает когда увеличиваю размеры массива и чтения файла - скажем говорю прочитать 2000 байт (измению 1000 на 2000 везде где надо в сорсе) - тут программа виснет где-то в процессе чтения файла. Не пойму что происходит... cranky.gif

Конфигурация памяти очень проста:
Код
MEMORY
{
    PAGE 0: EPROG: origin = 0x1200, len = 0x7c00
          
    PAGE 1: IDATA: origin = 0x80,   len =0x8000
}  

SECTIONS
{
  
    .text:    {} > EPROG PAGE 0
    .bss:     {} > IDATA PAGE 1
    .const:   {} > IDATA PAGE 1
    .switch:  {} > IDATA PAGE 1
    .sysmem:  {} > IDATA PAGE 1
    .stack    {} > IDATA PAGE 1
}


думал проблема может быть в памяти - но вроде ее достаточно в конфигурации.

Подскажите что может быть ? help.gif

Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BratherLU
сообщение May 30 2007, 05:37
Сообщение #2


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

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Возможно я неправильно выразился - затирается часть кода уже во время выполнения программы (запись в массивы) Из-за того что память данных отображена на программную память

Линкер не причем, он размещает секции кода и данных на тех страницах памяти которые указаны в .cmd, но он ничего не знает о состоянии регистров управления CPU (PMST, ST0, ST1 для с54x)(для него Page 0 и Page 1 - физически разные участки)
Программно ввести процессор в нужный режим после ресета = сконфигурировать карту памяти, задать расположение таблицы векторов прерываний, насыщение результата аривфметических операций... - обязанность разработчика.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 30 2007, 07:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(BratherLU @ May 30 2007, 09:37) *
Возможно я неправильно выразился - затирается часть кода уже во время выполнения программы (запись в массивы) Из-за того что память данных отображена на программную память

Линкер не причем, он размещает секции кода и данных на тех страницах памяти которые указаны в .cmd, но он ничего не знает о состоянии регистров управления CPU (PMST, ST0, ST1 для с54x)(для него Page 0 и Page 1 - физически разные участки)
Программно ввести процессор в нужный режим после ресета = сконфигурировать карту памяти, задать расположение таблицы векторов прерываний, насыщение результата аривфметических операций... - обязанность разработчика.


ОК, т.е. если для линкера Page 0 и Page 1 физиечски разные участки, а в cmd файле их адресованные зоны пересекаются, значит похоже действительно в runtime данные (особенно ежели большие массивы) могут затереть часть кода ежели загружаются в зону наложения Page 0 и Page 1. Вроде логично.
Значит во избежании этого все-таки лучше наверно не пересекать адресные пространства Page 0 и Page 1 в конфигурации памяти. Так ?

Ежели прерывания не используются - я так понимаю нет надобности задавать расположение таблицы векторов, а ошибаюсь ?
Нужно будет еще разобраться как и в каком регистре задавать режим насыщения арифметики (хотя подозреваю это может быть default у процессора, не уверен).

На данном этапе нужно будет разобраться как конфигурировать внутреннюю и внешнюю память данных так чтоб большие массивы (закачка из файла) помещались во внешнюю, затем по мелким частям подкачивались в мелкие массивы во внутренней памяти для обработки...
Тут наверно нужна комбинация соотв. определения конфигурации в cmd файле, плюс соотв. pragma декларации в теле программы где надо...похоже на правду ?
Go to the top of the page
 
+Quote Post
BratherLU
сообщение May 30 2007, 09:21
Сообщение #4


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

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Цитата
ОК, т.е. если для линкера Page 0 и Page 1 физиечски разные участки, а в cmd файле их адресованные зоны пересекаются, значит похоже действительно в runtime данные (особенно ежели большие массивы) могут затереть часть кода ежели загружаются в зону наложения Page 0 и Page 1. Вроде логично.

Да Если память данных отображена на память программ
Цитата
Значит во избежании этого все-таки лучше наверно не пересекать адресные пространства Page 0 и Page 1 в конфигурации памяти. Так ?

Так. Если не собираетесь модифицировать код во время выполнения программы и будете использовать только внутреннюю память процессора для кода и данных.
Цитата
Ежели прерывания не используются - я так понимаю нет надобности задавать расположение таблицы векторов, а ошибаюсь ?

Не ошибаетесь по умалчанию она находится в ROM по 0xff80
Цитата
Нужно будет еще разобраться как и в каком регистре задавать режим насыщения арифметики (хотя подозреваю это может быть default у процессора, не уверен).

Насыщение по умолчанию отклучено. Управляют им два бита sst в регистре pmst и ovm в регистре st1
Цитата
На данном этапе нужно будет разобраться как конфигурировать внутреннюю и внешнюю память данных так чтоб большие массивы (закачка из файла) помещались во внешнюю, затем по мелким частям подкачивались в мелкие массивы во внутренней памяти для обработки...
Тут наверно нужна комбинация соотв. определения конфигурации в cmd файле, плюс соотв. pragma декларации в теле программы где надо...похоже на правду ?

Да
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 30 2007, 11:57
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(BratherLU @ May 30 2007, 13:21) *
Да Если память данных отображена на память программ

Так. Если не собираетесь модифицировать код во время выполнения программы и будете использовать только внутреннюю память процессора для кода и данных.

Не ошибаетесь по умалчанию она находится в ROM по 0xff80

Насыщение по умолчанию отклучено. Управляют им два бита sst в регистре pmst и ovm в регистре st1

Да


ОК, понял, thanks.

Насколько понял, у C5402 разделить внутреннюю и внешнюю память можно только соответствующей адресацией (или конфигурацией памяти). Судя по его daatsheet, внутренний RAM заканчивается на 0х3FFF, после чего адрессное пространство (0х4000 - 0хEFFF) относиться ко внешнему RAMу. Предполагая что внешний SRAM и повешен на адреса от 0х4000 и выше, я думаю что для разделения внешней и внутренней памяти, я обязан в cmd файле разделить адреса физически (например PAGE 0 разместить во внутреннем RAMе как программа (адреса то 0х3FFF), PAGE 1 разместить во внешней (т.е. указать адресное пространство от 0х4000 до 0хEFFF) и часть во внутренней. Но все PAGES обязаны быть визически расделены адресами. Это верно ?
При этом, в SECTIONS определить секции где хранятся большие массивы данных в простарнство относящееся ко внешней памяти, а секции которые будут содержать малекие оперативные массивы данные для текущей обработки - в пространство данных во внутренней памяти.
Пока я не совсем понимаю какие из sections содержат большие массивы данных, а в какие идут оперативные данные....

Вот новый cmd файл для моего проэкта (где закачиваются файлы данных):
Код
MEMORY
{
    PAGE 0: EPROG : origin = 0x80,      len = 0x1200      /* Internal RAM */
          
    PAGE 1: INRAM  : origin = 0x1280,  len = 0x2D80 /* Internal RAM */
    PAGE 1: EXRAM : origin = 0x4000,  len = 0xAFFF  /* External RAM */
}  

SECTIONS
{
  
    .text:    {} > EPROG PAGE 0
    .bss:     {} > EXRAM PAGE 1
    .const:   {} > INRAM PAGE 1
    .switch:  {} > INRAM PAGE 1
    .sysmem:  {} > INRAM PAGE 1
    .stack    {} > INRAM PAGE 1
    .data     {} > EXRAM PAGE 1
}


Судя по map файлу, 6kB массив данных (закачка с файла), занесен в секцию .bss, посему ее определил во внешний RAM.
Но пока не пойму как указать определение оперативных массивов данных (небольших) во внутренний RAM (INRAM)... cranky.gif
Go to the top of the page
 
+Quote Post
BratherLU
сообщение May 30 2007, 12:29
Сообщение #6


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

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Цитата(Саша Z @ May 30 2007, 15:57) *
Но пока не пойму как указать определение оперативных массивов данных (небольших) во внутренний RAM (INRAM)... cranky.gif

вот так->
Цитата
//-----------------------------------------------------
*.cmd
...
SECTIONS
{
...
.MiniData: {} > INRAM PAGE 1 /*Определяем секцию и помещаем ее в INRAM*/
...
}
//-----------------------------------------------------
*.c
...
#pragma DATA_SECTION(Mini1,".MiniData");
short Mini1[MINI_ARRAY_SIZE];
#pragma DATA_SECTION(Mini2,".MiniData");
short Mini2[MINI_ARRAY_SIZE];
...
//-----------------------------------------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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