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

 
 
> Чтение бинарного файла в проэкт 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

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


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

 


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


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