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

 
 
 
Reply to this topicStart new topic
> Запись файла в память программ
SALOME
сообщение Jan 9 2008, 11:12
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349



Задача такова: создается файл неких 8-байтовых констант. Длина файла до 30Кбайт. Требуется записать содержимое этого файла в память команд 51процессора. Конкретно в ADuC845. Т.е. каким-то образом включить этот файл в тело программы, а потом перегнать загрузчиком в память программ процессора. . Пробовала #INCLUDE, но не получается. Пишу на ASM51 и С51. Есть оболочка "Keil uVision3". Помогите, кто чем может...


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 9 2008, 11:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SALOME @ Jan 9 2008, 14:12) *
Задача такова: создается файл неких 8-байтовых констант. Длина файла до 30Кбайт. Требуется записать содержимое этого файла в память команд 51процессора.

Файл создается кем? Вами? В каком виде данные?
Создавайте его (файл) в виде кусочка программы инициализации массива данных и подключайте с помощью include. Например, на языке С это будет как-то так
pdata char massiv[][8]=
{
#include "file.c"
};

Файл file.c (это файл Ваших констант) должен иметь вид типа
{ 1, 2, 3, 4, 5, 6, 7, 8},
{ 9,10,11,12,13,14,15,16},
............. и т.д.
Go to the top of the page
 
+Quote Post
jack_avenger
сообщение Jan 9 2008, 11:50
Сообщение #3


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

Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426



Вот как сделано у меня:

основная программа:
Код
Init_CE_DRam:
$include(Pram13b.A51)



файл Pram13b.A51:
Код
;CE Program Image File (Verilog Hex)
dw    020D6h,0743Dh,08F3Dh,0F03Dh,0B5D8h,020D8h,01FE6h,08FD8h
dw    08F9Bh,0003Ch,00EE6h,0D03Ch,0B19Bh,0209Bh,08C9Bh,020D7h
dw    0743Eh,08F3Eh,0F03Eh,0B5D9h,020D9h,01FE6h,08FD9h,08F9Bh
..........................................................


Если конвертировать из BIN вручную долго то можно найти или написать мелкую программу для этих целей
Go to the top of the page
 
+Quote Post
SALOME
сообщение Jan 10 2008, 04:14
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349



Цитата(Палыч @ Jan 9 2008, 18:43) *
Файл создается кем? Вами? В каком виде данные?

Файл file.c (это файл Ваших констант) должен иметь вид типа
{ 1, 2, 3, 4, 5, 6, 7, 8},
{ 9,10,11,12,13,14,15,16},
............. и т.д.

Файл создается линкером и представляет собой последовательность команд для DSP. Вид у него - двоичные восьми разрядные коды (AF1C3B...), но можно и в INCLUDE виде (т.е.
0хАF,
0x1C,
0x3B,
......
Потом эти команды будут перегружаться в DSP по СОМ порту.
По Вашему фрагменту я пробовала: создается массив из файла и вставляется в прогу. Но линковщик не понимает, что это за символы и выдает ошибку...

Цитата(jack_avenger @ Jan 9 2008, 18:50) *
Если конвертировать из BIN вручную долго то можно найти или написать мелкую программу для этих целей

Не хотелось бы конвертировать...Может как-то по другому?


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 10 2008, 06:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SALOME @ Jan 10 2008, 07:14) *
Файл создается линкером и представляет собой последовательность команд для DSP. Вид у него - двоичные восьми разрядные коды (AF1C3B...), но можно и в INCLUDE виде (т.е.
0хАF,
0x1C,
0x3B,
......
Потом эти команды будут перегружаться в DSP по СОМ порту.
По Вашему фрагменту я пробовала: создается массив из файла и вставляется в прогу. Но линковщик не понимает, что это за символы и выдает ошибку...
Если у Вас - просто поток байтов, которые Вы будете передавать по UART, то можно не замарачиваться с тем, что передаваемые команды имеют восьмибайтное представление. Т.е.
Код
void WriteToDSP(char *buf, int len); // Ваша программа передачи буфера buf длинною len байт в DSP
pdata char massiv[]=
{

// file.c - файл, созданный линкером для DSP в include виде
#include "file.c"
};
..........................
WriteToDSP(massiv, sizeof(massiv));

P.S. Кстати, почему линковщик выдает ошибку? Что за ошибку? Транслятор - всё это пропускает? Может быть банально не хватает памяти?
Go to the top of the page
 
+Quote Post
SALOME
сообщение Jan 10 2008, 08:23
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349



Цитата(Палыч @ Jan 10 2008, 13:41) *
pdata char massiv[]=
{

// file.c - файл, созданный линкером для DSP в include виде
#include "file.c"
};

pdata - это область памяти в ОЗУ и она ограничена 256 байт. А мне надо запомнить в памяти команд :-(.


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 10 2008, 08:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SALOME @ Jan 10 2008, 11:23) *
pdata - это область памяти в ОЗУ и она ограничена 256 байт. А мне надо запомнить в памяти команд :-(.
Извините - недоглядел, ошибся: "pdata" необходимо заменить на "code"
Go to the top of the page
 
+Quote Post
SALOME
сообщение Jan 11 2008, 03:35
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349



Цитата(Палыч @ Jan 10 2008, 15:30) *
Извините - недоглядел, ошибся: "pdata" необходимо заменить на "code"

Спасибо, Палыч. Программа выполнилась и сформировала файл как надо.

#include <REG52.H>
#include <stdio.h>

void WriteToDSP(char *buf, int len);
code char massiv[]=
{
#include "file.ldr"
};

void main (void)
{
WriteToDSP(massiv, sizeof(massiv));
}

Однако при линковке выдались предупреждения:

WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _WRITETODSP
WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _WRITETODSP.
Чтобы это значило? Кроме того исходный файл принимается в INCLUDE виде, а в объектном коде - не понимает.


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 11 2008, 06:45
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SALOME @ Jan 11 2008, 06:35) *
Однако при линковке выдались предупреждения:
WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _WRITETODSP
WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _WRITETODSP.
Чтобы это значило?
Ну, а что же Вы хотели? Процедуру WriteToDSP Вы не написали. Обращение к некой (выдуманой мной) процедуре WriteToDSP я привел в качестве примера для определения количества передаваемых в DSP байт из массива massiv.

Цитата(SALOME @ Jan 11 2008, 06:35) *
Кроме того исходный файл принимается в INCLUDE виде, а в объектном коде - не понимает.
Обьектный код - это выходной файл линкера DSP (не include вид)? Не знаю - какова его форма представления (я - DSP не занимаюсь), возможно - это просто бинарник. Файлы данных в произвольном двоичном виде в Keil включить в проект не представляется возможным. Когда мне потребовалось в программу на МК включить некие данные (образ программы другого МК) я делал примерно так, как посоветовал Вам.
Go to the top of the page
 
+Quote Post
редактор
сообщение Jan 23 2008, 07:10
Сообщение #10


Местный
***

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



Есть другой вариант решения проблемы. Может быть более сложный но тем не менее
можно объявить массив данных по определенному адресу, а бинарник вписать туда потом, на этапе программирования.
выглядеть будет примерно так

code char DSP_CMD[1024] _at_ 0x2000;

Линкер разместит массив из 1024 байт по адресу 0x2000h
При программировании нужно будет по этому адресу записать бинарник. Никаких преобразований не требуется.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post

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

 


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


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