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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Си указатель на таблицу, Как пристегнуть массив?
Alhen
сообщение Feb 2 2006, 18:19
Сообщение #1


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

Группа: Свой
Сообщений: 161
Регистрация: 17-08-04
Из: Караганда
Пользователь №: 516



Все решено перехожу на Си!
Только вот незадача, первая же простенькая практическая задача
для AVR контроллера поставила в тупик.
Суть программы:
- в памяти программ размещается таблица или массив;
- берем по очереди байт из массива и выкидываем в коммуникационный порт.

Массив находится в пристегиваемом файле и я не понимаю как указать
какому либо поинтеру на начало таблицы.
На ассемблере все получается достаточно гармонично:
Код
    ldi zh,high(Transmit_Buff*2); Load Z-pointer
    ldi zl,low(Transmit_Buff*2); to the beginning of Receive_Buff

Transmit_Loop:

USART_Transmit:
; Wait for empty transmit buffer
    sbis UCSRA,UDRE
    rjmp USART_Transmit
; Put data  into buffer, sends the data
    lpm  Data_IN, Z+
    out UDR, Data_IN

        ldi  TempReg,high(end_of_file*2); Check if we got high end_of_file
        cp   TempReg,zh        ; Compare
        breq got_high_end_of_file; If equal then check the Low part
            rjmp go_further:

got_high_end_of_file:
        ldi  TempReg,low(end_of_file*2); Check if we got low end_of_file
        cp   TempReg,zl        ; Compare
        breq got_low_end_of_file; If equal then reload Z-pointer
            rjmp go_further:

got_low_end_of_file:
        ldi zh,high(Transmit_Buff*2); Load Z-pointer
        ldi zl,low(Transmit_Buff*2); to the beginning of Receive_Buff

go_further:
rjmp Transmit_Loop

Transmit_Buff:

.include "AIS_LOG.txt"

end_of_file:
nop

Реализация подбной программы на Си AVR для меня загадка.
Тем более что я нашел подходящую конструкцию на VisualDSP,
Код
complex_fract16 in[VEC_SIZE] =
{
    #include "in.dat"
};

но в CVAVR такое не проходит!!!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 2 2006, 18:56
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Код
struct {
        volatile    BYTE    mode;
        volatile    WORD    timeout;
        volatile    BYTE    errc;
        
        volatile    WORD    tx_cnt;
        volatile    WORD    tx_len;
        BYTE*tx_buf;
        
        volatile    WORD    rx_cnt;
        volatile    WORD    rx_len;
        BYTE*                rx_buf;
        } UCB;

//RS485 direction
#define    DIR_BIT        2
#define DIR_TX        PORTD |= (1<<DIR_BIT)
#define DIR_RX        PORTD &= ~(1<<DIR_BIT)
//--------------------------------------------------------------------------
//UART modes
#define    TX_BUSY        0
#define    RX_BUSY        1
#define    RX_READY    2

//--------------------------------------------------------------------------
SIGNAL(SIG_USART_TRANS)
{
if(UCB.tx_cnt < UCB.tx_len)
    {
    UDR0 = UCB.tx_buf[UCB.tx_cnt++];
    }
else
    {
    UCB.tx_cnt = 0;
    CLR_TX_BUSY;
    _NOP();
    _NOP();
    _NOP();
    DIR_RX;
    }
}
//--------------------------------------------------------------------------
BYTE TxStart(WORD len)
{
if(UCB.mode & TX_BUSY) return 1;
DIR_TX;
_NOP();
_NOP();
_NOP();
UCB.tx_cnt  = 0;
UCB.tx_len  = len;
SET_TX_BUSY;
SIG_USART_TRANS();
return 0;
}
//--------------------------------------------------------------------------

Структура UCB содержит связанные с УАРТом переменные
присутствует кое-что лишнее для RS485, можно выкинуть.
Указатель UCB.tx_buf указывает на массив для отправки.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Old1
сообщение Feb 2 2006, 19:43
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Alhen @ Feb 2 2006, 22:19) *
Массив находится в пристегиваемом файле и я не понимаю как указать
какому либо поинтеру на начало таблицы.


Код
__flash unsigned char TABL[10]={1,2,3,4,5,6,7,8,9,10};//определение таблицы во flash


запись в указатель адреса начала таблицы:
Код
unsigned char __flash *PTR;//определение указателя на flash
//.........
PTR=TABL;//запись в указатель начального адреса таблицы

Да, я работаю с ИАРом, возможно в CVAVR указатель на массив и сам массив во flash описывается немного подругому, но обращение к нему и к массиву делается также...
Go to the top of the page
 
+Quote Post
Alhen
сообщение Feb 3 2006, 04:52
Сообщение #4


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

Группа: Свой
Сообщений: 161
Регистрация: 17-08-04
Из: Караганда
Пользователь №: 516



Цитата
__flash unsigned char TABL[10]={1,2,3,4,5,6,7,8,9,10};//определение таблицы во flash


Не могу я набирать массив ручками, там пару тысяч байт, поэтому храню его в отдельном
файле в текстовом формате и должен пристегнуть его.
Например,

#include "tabl.dat";

вот теперь как определить его в виде TABL[length_of_table] ?
или определить начальный адрес размещения данных, а потом передать это значение указателю?
Go to the top of the page
 
+Quote Post
vet
сообщение Feb 3 2006, 06:45
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(Alhen @ Feb 3 2006, 07:52) *
Цитата

__flash unsigned char TABL[10]={1,2,3,4,5,6,7,8,9,10};//определение таблицы во flash


Не могу я набирать массив ручками, там пару тысяч байт, поэтому храню его в отдельном
файле в текстовом формате и должен пристегнуть его.
Например,

#include "tabl.dat";

вот теперь как определить его в виде TABL[length_of_table] ?
или определить начальный адрес размещения данных, а потом передать это значение указателю?

Вам поможет программа bin2asc. На входе она получает бинарник, на выходе - выдаёт текстовый файл со списком байтов, который можно вставлять в исходники.
Прикрепленные файлы
Прикрепленный файл  BIN2ASC.rar ( 14.75 килобайт ) Кол-во скачиваний: 49
 


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Old1
сообщение Feb 3 2006, 07:46
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Alhen @ Feb 3 2006, 08:52) *
Не могу я набирать массив ручками, там пару тысяч байт, поэтому храню его в отдельном
файле в текстовом формате и должен пристегнуть его.

По подробнее плиз, что из себя файл с массивом представляет, и как вы его создаете?
Кстати, я в таких случаях тоже не набираю ручками. Файл (с определением массива) генерю при помощи простенькой проги написанной на DELPHI (каждый раз пишу под задачу, делать универсальную лень), там (и не только там) это делается элементарно...
Go to the top of the page
 
+Quote Post
BVU
сообщение Feb 3 2006, 08:05
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Таблицу всегда можно представить массивом, либо структурой. В 'C' всегда адрес массива он же адрес первого элемента массива может быть представлен указателем.
int buff[100];
int *f;
f = buff; или f = &buff[0];


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
Nixon
сообщение Feb 3 2006, 08:30
Сообщение #8


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Я делал вот так:

в файле "data.txt" :
Код
#define MACROS1 { 1, 2, 3, 4, ... остальные данные  }


в основном файле
Код
...
#include "data.txt"
...
const VARIABLE1 char [SIZE] = MACROS1


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Feb 3 2006, 10:07
Сообщение #9


Иногдящий
****

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



А еще в IAR можно пристегнуть любой файл как бинарный массив, назначив его указателю с указанным именем. Это в опциях линкера, если не ошибаюсь.
Go to the top of the page
 
+Quote Post
k0t
сообщение Feb 3 2006, 13:19
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 53
Регистрация: 11-01-05
Пользователь №: 1 889



Проще и удобнее всего подключение файла делать так:
__hugeflash unsigned char file[]={#include "file.c"};

file.c сделать из бинарника с помощью bin2asc smile.gif

Размер массива определяется так (если он меняется, иначе можно константу забить):
file_length=sizeof(file)/sizeof(unsigned char);
Go to the top of the page
 
+Quote Post
Old1
сообщение Feb 3 2006, 18:46
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(k0t @ Feb 3 2006, 17:19) *
Проще и удобнее всего подключение файла делать так:
__hugeflash unsigned char file[]={#include "file.c"};

В каком компиляторе такое проходит? Попробовал в ИАРе для AVR 4.11, ругается:
Error[Pe010]: "#" not expected here ...
Error[Pe029]: expected an expression ...
Go to the top of the page
 
+Quote Post
vet
сообщение Feb 3 2006, 21:02
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(Old1 @ Feb 3 2006, 21:46) *
Цитата(k0t @ Feb 3 2006, 17:19) *

Проще и удобнее всего подключение файла делать так:
__hugeflash unsigned char file[]={#include "file.c"};

В каком компиляторе такое проходит? Попробовал в ИАРе для AVR 4.11, ругается:
Error[Pe010]: "#" not expected here ...
Error[Pe029]: expected an expression ...

Команды препроцессора всегда пишутся в отдельной строке.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Alhen
сообщение Feb 4 2006, 06:00
Сообщение #13


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

Группа: Свой
Сообщений: 161
Регистрация: 17-08-04
Из: Караганда
Пользователь №: 516



2Nixon
Попробывал я обыграть макрос и в CodeVision прошел следующий вариант:
Код
#include "my_table.txt"
flash unsigned char my_array[] = in_table;


Включаемый файл при этом выглядел так:
Код
#define in_table {\
0x01, 0x02,\
0x03, 0x04 \
....
};\


Что еще приятно, работает sizeof
Код
a = sizeof(my_array);


2kOt
Вариант типа
Код
flash unsigned char my_array[]={#include "my_table.txt"};


в Code Vision не проходит?! Хотя все логично, тем более что в VDSP++ есть
подобная конструкция

2 Old1 & vet
По поводу конвертации бинарного файла я уже поднимал тему на форуме.
И программа BIN2ASC.exe показалась сперва чрезвычайно полезной, тем не менее мне пришлось
написать свою на Паскале, потому что я тогда работал на Ассемблере под AVR Studio
и программа не принимала сгенерированный ascii файл, по следующим причинам:
- она глючила на десятичные числа с нулями впереди, например 040 воспринимая их за операторы
- не понимала шестнадцатеричный формат без 0x - префикса (естественно)
- не признавала директиву db без точки впереди
- и к тому же, AVR Studio ругается на нечетное количество операндов в строке (наверное из-за
16 разрядной структуры памяти программ)

Код
.db 183, 001, 137, 255, 255, 134, 254, 255, 133, 255, 255, 255, 243, 041, 255,


а их то 11 то 15 штук в строке.
Любой после этого кинется писать свой конвертор.

2AndyBig и всем
Уже вижу что Си компиляторы все разные, может мне не стоит заморачиваться с Code Vision
, а сразу работать в IAR и т.п., что посоветуете.
Я то стартанул по известному курсу AVR123 http://electronix.ru/redirect.php?http://[banned]/. И могу сказать что Image Craft мне не нравится.
Он не генерит ассемблер, а самое главное ИМХО у него ограниченный Си.
Go to the top of the page
 
+Quote Post
k0t
сообщение Feb 4 2006, 12:30
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 53
Регистрация: 11-01-05
Пользователь №: 1 889



Цитата(Old1 @ Feb 3 2006, 21:46) *
Цитата(k0t @ Feb 3 2006, 17:19) *

Проще и удобнее всего подключение файла делать так:
__hugeflash unsigned char file[]={#include "file.c"};

В каком компиляторе такое проходит? Попробовал в ИАРе для AVR 4.11, ругается:
Error[Pe010]: "#" not expected here ...
Error[Pe029]: expected an expression ...


Так ругаться не будет:

__hugeflash unsigned char file[]={
#include "file.c"
};
Go to the top of the page
 
+Quote Post
vet
сообщение Feb 4 2006, 12:42
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(Alhen @ Feb 4 2006, 09:00) *
Уже вижу что Си компиляторы все разные, может мне не стоит заморачиваться с Code Vision
, а сразу работать в IAR и т.п., что посоветуете.
Я то стартанул по известному курсу AVR123 http://electronix.ru/redirect.php?http://[banned]/. И могу сказать что Image Craft мне не нравится.
Он не генерит ассемблер, а самое главное ИМХО у него ограниченный Си.


К IAR, пожалуй, слово "заморачиваться" подходит куда как точнее, чем к CV smile.gif
Собственно, мне CodeVision нравится именно своей простотой и удобством. Плюс полезные библиотеки в составе дистрибутива.
Насчёт ImageCraft соглашусь.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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