|
Си указатель на таблицу, Как пристегнуть массив? |
|
|
|
Feb 2 2006, 18:19
|

Частый гость
 
Группа: Свой
Сообщений: 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 такое не проходит!!!
|
|
|
|
|
Feb 2 2006, 18:56
|

Профессионал
    
Группа: Свой
Сообщений: 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 указывает на массив для отправки.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Feb 2 2006, 19:43
|

Знающий
   
Группа: Свой
Сообщений: 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 описывается немного подругому, но обращение к нему и к массиву делается также...
|
|
|
|
|
Feb 3 2006, 04:52
|

Частый гость
 
Группа: Свой
Сообщений: 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] ? или определить начальный адрес размещения данных, а потом передать это значение указателю?
|
|
|
|
|
Feb 3 2006, 06:45
|
Знающий
   
Группа: Свой
Сообщений: 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. На входе она получает бинарник, на выходе - выдаёт текстовый файл со списком байтов, который можно вставлять в исходники.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Feb 3 2006, 08:30
|
Гуру
     
Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48

|
Я делал вот так: в файле "data.txt" : Код #define MACROS1 { 1, 2, 3, 4, ... остальные данные } в основном файле Код ... #include "data.txt" ... const VARIABLE1 char [SIZE] = MACROS1
--------------------
Вам помочь или не мешать?
|
|
|
|
|
Feb 3 2006, 13:19
|
Участник

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

|
Проще и удобнее всего подключение файла делать так: __hugeflash unsigned char file[]={#include "file.c"}; file.c сделать из бинарника с помощью bin2asc  Размер массива определяется так (если он меняется, иначе можно константу забить): file_length=sizeof(file)/sizeof(unsigned char);
|
|
|
|
|
Feb 3 2006, 18:46
|

Знающий
   
Группа: Свой
Сообщений: 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 ...
|
|
|
|
|
Feb 3 2006, 21:02
|
Знающий
   
Группа: Свой
Сообщений: 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 ... Команды препроцессора всегда пишутся в отдельной строке.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Feb 4 2006, 06:00
|

Частый гость
 
Группа: Свой
Сообщений: 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 мне не нравится. Он не генерит ассемблер, а самое главное ИМХО у него ограниченный Си.
|
|
|
|
|
Feb 4 2006, 12:30
|
Участник

Группа: Свой
Сообщений: 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" };
|
|
|
|
|
Feb 4 2006, 12:42
|
Знающий
   
Группа: Свой
Сообщений: 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  Собственно, мне CodeVision нравится именно своей простотой и удобством. Плюс полезные библиотеки в составе дистрибутива. Насчёт ImageCraft соглашусь.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|