Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись файла в память программ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
SALOME
Задача такова: создается файл неких 8-байтовых констант. Длина файла до 30Кбайт. Требуется записать содержимое этого файла в память команд 51процессора. Конкретно в ADuC845. Т.е. каким-то образом включить этот файл в тело программы, а потом перегнать загрузчиком в память программ процессора. . Пробовала #INCLUDE, но не получается. Пишу на ASM51 и С51. Есть оболочка "Keil uVision3". Помогите, кто чем может...
Палыч
Цитата(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},
............. и т.д.
jack_avenger
Вот как сделано у меня:

основная программа:
Код
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 вручную долго то можно найти или написать мелкую программу для этих целей
SALOME
Цитата(Палыч @ 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 вручную долго то можно найти или написать мелкую программу для этих целей

Не хотелось бы конвертировать...Может как-то по другому?
Палыч
Цитата(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. Кстати, почему линковщик выдает ошибку? Что за ошибку? Транслятор - всё это пропускает? Может быть банально не хватает памяти?
SALOME
Цитата(Палыч @ Jan 10 2008, 13:41) *
pdata char massiv[]=
{

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

pdata - это область памяти в ОЗУ и она ограничена 256 байт. А мне надо запомнить в памяти команд :-(.
Палыч
Цитата(SALOME @ Jan 10 2008, 11:23) *
pdata - это область памяти в ОЗУ и она ограничена 256 байт. А мне надо запомнить в памяти команд :-(.
Извините - недоглядел, ошибся: "pdata" необходимо заменить на "code"
SALOME
Цитата(Палыч @ 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 виде, а в объектном коде - не понимает.
Палыч
Цитата(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 включить в проект не представляется возможным. Когда мне потребовалось в программу на МК включить некие данные (образ программы другого МК) я делал примерно так, как посоветовал Вам.
редактор
Есть другой вариант решения проблемы. Может быть более сложный но тем не менее
можно объявить массив данных по определенному адресу, а бинарник вписать туда потом, на этапе программирования.
выглядеть будет примерно так

code char DSP_CMD[1024] _at_ 0x2000;

Линкер разместит массив из 1024 байт по адресу 0x2000h
При программировании нужно будет по этому адресу записать бинарник. Никаких преобразований не требуется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.