Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Продукция MICROCHIP (http://www.microchip.su/forumdisplay.php?f=6)
-   -   небольшой пример на ХС8 для PIC18xxxQ43 (вопрос) (http://www.microchip.su/showthread.php?t=18631)

Марк 26.04.2020 18:14

небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
В Си я не большой мастер, поэтому нуждаюсь в совете.
Начальные условия.
Имеем PIC18F27Q43, отличающийся тем, что ОЗУ общего назначения у него расположено не с нулевых адресов, а с 0x0500. Ну а регистры специального назначения в младшей части. То есть все наоборот, по сравнению с прежними К20/К22.
Задача.
Нужно сформировать пакет из 82 байт в УАРТ состоящий из некоторых констант обеспечивающих синхронизацию и некие неизменные данные, а так же из данных которые загружаются из переменных разной разрядности, которые разбиты в этом пакете побайтно как "маленький индеец"
До сих пор я все это делал на АСМе (на 16-разрядных микрочипах) путем перегрузки таблицы в массив ОЗУ, где при перегрузке использовалось свойство указателей быть всегда больше одного байта. В таблице забиты байтные константы и указатели вперемешку, а программа загрузки их сортирует на лету. Константу сразу в массив, а указатель сначала извлекает переменную, а потом помещает ее значение в массив с разбивкой побайтно.
При косвенной адресации в 16-битниках, естественно, используется 16-битный указатель, поскольку адрес содержится в одном регистре. И все отлично работает.
Нынче решил написать этот же код на Си для устройства использующего вышеобъявленный МК.
А теперь вопрос.
Ниже привожу фрагмент кода по существу решаемой задачи. Компилятор (как я и ожидал) выдал кучу варнингов по поводу опасного преобразования типов. Но в этом МК размер ОЗУ гораздо меньше 65К, хотя формально указатели на константы во флеше требуют 24-разрядных указателей. Код вроде бы генерируется нормальный, как задумано, но вопросы остались:
Код:

unsigned char arrayUARTout [82];

const unsigned int __at(TABLE_UART_OUT) tabUARTout[82]= {
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xAA,
&power,&frequence.Lo,&frequence.Hi,&deviation.Lo,&deviation.Hi,&freqMod.Lo,&freqMod.Hi,&concID485,0xAA,
&systemConfig.Com,&serialNum.Lo,&serialNum.Hi,&gateFrequence.Lo,&gateFrequence.Hi,&gateDeviation.Lo,&gateDeviation.Hi,&gateFreqMod.Lo,0xAA,
&gateFreqMod.Hi,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAA,
0x00,0x00,0x00,0x00,0x00,TYPE_OF_DEVICE,&countPacket,0x01,0xAA,
};
.............
.............
void LoadUARTout(void) {

    unsigned char index;

    for (index=0;index<sizeof(tabUARTout);index++) {
        if (tabUARTout[index]<0x100) {
            arrayUARTout[index]=(unsigned char)tabUARTout[index];
        } else {
            arrayUARTout[index]=(unsigned char*)tabUARTout[index];
        }
    }
}

Прошу обратить внимание на разыменование структур в таблице и приведение к указателю в последней строке кода...
Собственно варнинги и смущают...
Спасибо.

SergP01 26.04.2020 20:54

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
ну... я бы убрал (unsigned .... )
на размер переменной ( байт) это не влияет....:)

а так.... может какая то переменная больше char....

иии.... может я туплю....
но вроде так надо
arrayUARTout[index]=*((char*)tabUARTout[index]);

Марк 26.04.2020 21:38

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Все переменные - это структуры с разбивкой на байты. И в таблице адреса элементов структур. Так что больше байта быть не может. Все байты беззнаковые.
Насчет последнего прошу пояснить смысл. Возможно Вы и правы. Насколько я понял, внутри - это приведение к разрядности указателя, а снаружи - значение по указателю...

BarsTmb 26.04.2020 21:41

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244229)
Собственно варнинги и смущают...

Присваивание числовым переменным указателей всегда будет порождать варнинги при неявном преобразовании типа.
Можно попробовать явно, например ..., (const unsigned int)&systemConfig.Com,...

зы. Иногда можно для понимания разбить выражение на два
char *ptr =(char*)tabUARTout[index];
аrrayUARTout[index]=*ptr;

SergP01 26.04.2020 21:47

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244231)
Все переменные - это структуры с разбивкой на байты. И в таблице адреса элементов структур. Так что больше байта быть не может. Все байты беззнаковые.
Насчет последнего прошу пояснить смысл. Возможно Вы и правы. Насколько я понял, внутри - это приведение к разрядности указателя, а снаружи - значение по указателю...

по первому... мой компилятор меня посылает нах с инитом массива указателем :)
по второму... да... мы говорим, что получаем указатель на char из массива, а потом считываем оттуда значение по указателю...

по сути
char byte( char * p)
{
char a=*p;
return(a);
}

Марк 26.04.2020 22:13

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от SergP01 (Сообщение 244233)
по первому... мой компилятор меня посылает нах с инитом массива указателем :)

Патамушта это платформозависимая фича. Она работает только при условии двухбайтных указателей.
И к тому же в таблице не указатель, а адрес.
Что касается самой таблицы, то придется ее копировать в ОЗУ, причем для скорости через ДМА. Я чего то легкомысленно понадеялся на компилятор, но он табличное чтение напрямую через средства Си не делает...
Завтра скорректирую, но проверить все равно не смогу. Только на живом чипе. Чип есть, но плата задерживается на границе... Паять проводками к SSOP28 неохота. :)

Марк 26.04.2020 22:23

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от BarsTmb (Сообщение 244232)
Присваивание числовым переменным указателей всегда будет порождать варнинги при неявном преобразовании типа.

Я тут немного вопросов на микрочип.ком позадавал, так вот там меня на одну мысль натолкнули и я ее подтвердил из мануала на ХС8. Смысл в том, что явно типы преобразовывать нужно лишь в крайнем случае, чтобы варнинги всегда генерировались и при этом нет опасности забыть о проблемах при изменении размерностей в коде... Типо варнинги напомнят. Но кто их читает? :)

SergP01 26.04.2020 23:41

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244234)
Патамушта это платформозависимая фича. Она работает только при условии двухбайтных указателей.
И к тому же в таблице не указатель, а адрес.

а разница какая? :)

SergP01 26.04.2020 23:47

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244235)
Я тут немного вопросов на микрочип.ком позадавал, так вот там меня на одну мысль натолкнули и я ее подтвердил из мануала на ХС8. Смысл в том, что явно типы преобразовывать нужно лишь в крайнем случае, чтобы варнинги всегда генерировались и при этом нет опасности забыть о проблемах при изменении размерностей в коде... Типо варнинги напомнят. Но кто их читает? :)

варнинги полезно читать.... асобливо про разные типы данных.... может косяк у прогаммера...
int i=257;
char j;
for (j=0;j<i;j++)....

а переменные обьявлены три года назад и хрен знает где...:D

Марк 26.04.2020 23:54

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от SergP01 (Сообщение 244236)
а разница какая? :)

Странно, что программист не знает разницы между этими понятиями. Адрес - это ЧИСЛО. А указатель - это РЕГИСТР. Первое - это вода, а второе - ведро. Указатель нельзя разместить в таблице констант. Но можно разместить в массиве указателей. ;)

SergP01 27.04.2020 00:03

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244234)
Что касается самой таблицы, то придется ее копировать в ОЗУ, причем для скорости через ДМА. Я чего то легкомысленно понадеялся на компилятор, но он табличное чтение напрямую через средства Си не делает...
Завтра скорректирую, но проверить все равно не смогу. Только на живом чипе. Чип есть, но плата задерживается на границе... Паять проводками к SSOP28 неохота. :)

а у вас её куда компилятор пихает?
.... ну может быть ваш компилятор из-за "const" производит жёсткий инит массива и во флешь его пихает....
попробуйте volatile
даты он уже не будет иметь права его во флешь прописывать...

SergP01 27.04.2020 00:13

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244238)
Странно, что программист не знает разницы между этими понятиями. Адрес - это ЧИСЛО. А указатель - это РЕГИСТР. Первое - это вода, а второе - ведро. Указатель нельзя разместить в таблице констант. Но можно разместить в массиве указателей. ;)

это вопросы терминологии применительно к языкам программирования... по сути указатель- это число(адрес) ...
char* p=&a - добыть адрес...
*p -вытащить данные из адреса....
:)

стати... ежели функция большая или заумная... то " p " может еще и сбегать во временную память или в стек :D

Марк 27.04.2020 00:14

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от SergP01 (Сообщение 244239)
а у вас её куда компилятор пихает?
...

У МЕНЯ он кидает константы во флеш. Во первых, он это делает в ХС8 по умолчанию, а во вторых, я ЯВНО указал адрес, куда он его разместил. __at() - квалификатор абсолютной адресации.
Но дело тут совсем не в этом. Константы могут быть и в ОЗУ. Но само понятие константы противоречит понятию указателя. Это такое странное ведро, в котором всегда налита вода, причем одна и та же....
Если Вы напишите :
int *pVar;
pVar=&abcd;
, то первая строка заставит линкер где то в ОЗУ выделить некие N-байт памяти, где N - это размерность (разрядность в байтах) АДРЕСНОЙ шины ОЗУ в МК.
А вторая строка запишет в эти регистры КОНСТАНТУ, которая будет равна адресу переменной abcd. Эту константу я могу записать в любую таблицу констант..., лишь бы размерность элементов таблицы соответствовала разрядности адресной шины ОЗУ в МК.

SergP01 27.04.2020 00:38

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244241)
У МЕНЯ он кидает константы во флеш. Во первых, он это делает в ХС8 по умолчанию, а во вторых, я ЯВНО указал адрес, куда он его разместил. __at() - квалификатор абсолютной адресации.
Но дело тут совсем не в этом. Константы могут быть и в ОЗУ. Но само понятие константы противоречит понятию указателя. Это такое странное ведро, в котором всегда налита вода, причем одна и та же....
Если Вы напишите :
int *pVar;
pVar=&abcd;
, то первая строка заставит линкер где то в ОЗУ выделить некие N-байт памяти, где N - это размерность (разрядность в байтах) АДРЕСНОЙ шины ОЗУ в МК.
А вторая строка запишет в эти регистры КОНСТАНТУ, которая будет равна адресу переменной abcd. Эту константу я могу записать в любую таблицу констант..., лишь бы размерность элементов таблицы соответствовала разрядности адресной шины ОЗУ в МК.

.... дык.... обьявите ваши структуры как конст... а массив как переменную... и пущай он при компиляции ваши константы в массив( в озу) складывает....
и не надо его( массив) пихать в ПЗУ, чтобы потом ещё и через ДМА делать его копию в ОЗУ.... какой в этом смысл?
он сам отожрёт себе памяти кусок и туда вас уже не пустит, ежели вы явно ломится не будете...:)

и к тому же- непонятно- зачем пихать адреса констант, запиханых в ПЗУ?

ежели они динамически не меняются, то и пишите
#define POWER 0x1055
#define freqMod_Lo 0x10FE
.....
компилятор всё в массив сложит... и ваша прога работать будет( отделять спец сигналы от конкретных значений

Марк 27.04.2020 05:15

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Я же все объяснил.
В представленной таблице есть синхронизирующие константы (и константы данных), а так же константы адреса.
Из них я не посылаю в уарт адреса, я в уарт посылаю только синхронизацию, а адреса проходят через ОДИН УКАЗАТЕЛЬ, чтобы превратится в байтные данные извлеченные по разным адресам. И лишь эти данные уходят в уарт.

Такая таблица является превосходно читаемой копией логической части протокола. Чтобы изменить расположение данных или внести новые данные в обмен, мне нужно объявить новую побайтную структуру этих данных и вписать её в таблицу в нужную позицию вместо нулей.
Тоже самое делает программист ПО. Это дело буквально десяти минут, включая наш с программистом ПО разговор по телефону.

Так вот, такая таблица может и не содержать констант, тогда она будет таблицей только адресов. Когда ее называют таблицей указателей, я понимаю о чем речь, но это ничего не меняет в ошибочности такого термина.
Что касается размещения таблицы в ОЗУ, то у меня таких таблиц четыре и никакого ОЗУ на них не хватит.
Поэтому я перед трансляцией данных из ОЗУ в буфер обмена создаю временную копию таблицы в одном и том же участке ОЗУ. Но это один маленький участок, а не куча таблиц.
Да и то, последнее я делаю вынужденно, потому как в этой архитектуре нет пространства видимости флеша из ОЗУ.

SergP01 27.04.2020 07:59

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
опять я понять не могу.... в плане таблицы с константами....

#define POWER 0x32
#define BLABLA1 0x15
#define BLABLA2 0x45
#define BLABLA3 0x23
#define BLABLA4 0x13

unsigned char arrayUARTout [82];

const unsigned CHAR __at(TABLE_UART_OUT) tabUARTout[82]= {
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xAA,
POWER,BLABLA1,BLABLA4,BLABLA3,BLABLA2,......

void LoadUARTout(void) {
memcpy( arrayUARTout , tabUARTout, sizeof(arrayUARTout));

if( усли нужно ткнуть динамическую переменную из структуры) arrayUARTout[2]=newStruct->byteStart;
}

и какая разница-
struct nnn
{
char POWER 0x32;
char BLABLA1 0x15;
char BLABLA2 0x45;
char BLABLA3 0x23;
char BLABLA4 0x13;
};

если это константы и лежат строго в определённом месте массива?

меняйте байты в полях дефайнов и всё....
с таким подходом и в пзу меньше памяти будет отъедаться

хотите много разных константных таблиц, чтобы при компиляции выбирать одну- сделайте условную компиляцию..

ну.... наверное я задачу до конца не просёк....

кстати а что быстрее будет работать, если константа POWER в нескольких местах программы нужна.
mov a,POWER.... или как там через указатель это же число загрузить....

SergP01 27.04.2020 08:56

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
кстати у вас там кусок с адресами на данные....
ежели в структуре все поля CHAR

то можно и так извратиться:)

void LoadUARTout(void) {
memcpy( arrayUARTout , tabUARTout, sizeof(arrayUARTout)); // грузим шаблон
memcpy( &arrayUARTout[10] , Struct, 12); // только поля в структуре должны быть в нужной последовательности

arrayUARTout[79]=Struct->countPacket;

}

Марк 27.04.2020 10:45

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от SergP01 (Сообщение 244244)
опять я понять не могу.... в плане таблицы с константами....

#define POWER 0x32


const unsigned CHAR __at(TABLE_UART_OUT) tabUARTout[82]= {
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xAA,
POWER,BLABLA1,BLABLA4,BLABLA3,BLABLA2,......

Откуда Вы взяли POWER 0x32?
У меня есть переменная power, значение которой может изменяться, а адрес которой назначит линкер. И значение этого адреса должно попасть в таблицу на это место.

Марк 27.04.2020 10:53

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от SergP01 (Сообщение 244245)
memcpy( arrayUARTout , tabUARTout, sizeof(arrayUARTout));

Вы ничего не понимаете в архитектурах контроллеров...
Для Вас, я так понимаю, все контроллеры имеют фоннеймановскую архитектуру.
А они все поголовно - гарварды. Есть advanced гарвард, где код может исполняться из ОЗУ и/или код хотя бы виден как ОЗУ нативно. Но в небольших 8-битных МК ЭТОГО НЕТ ОТ СЛОВА СОВСЕМ.
Поэтому все эти приблуды с memcpy, где сорцом выступает флеш, ни разу не катят. Как, впрочем, и дестинатором... :D А то у Вас и флеш залить хватит "смекалки" через memcpy... ;) Чего уж там...

Марк 27.04.2020 11:06

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от SergP01 (Сообщение 244244)
хотите много разных константных таблиц, чтобы при компиляции выбирать одну- сделайте условную компиляцию..

Какая еще, нахрен, условная компиляция, когда ВСЕ таблицы используются при исполнении кода?
Я написал универсальную void функцию перегрузки таблиц на одно и тоже место в ОЗУ. Я передаю в эту функцию имя таблицы (ее константный адрес) и ее длину в байтах и запускаю копирование через 6-ой канал ДМА, который спецом выделил для этой цели. Запустил и тут же использую буфер как таблицу, потому что ДМА раз в 20 быстрее кода работающего с таблицей в загружаемом буфере.
В dsPIC33F я использовал PSV-доступ, который прямо адресует флеш как ОЗУ, для чего есть макросы подставляющие адрес таблицы как константу при загрузке РОНа как указателя на таблицу.
В dsPIC33E ситуация стала разной, потому что флеш в МК - это узкое место в смысле скорости и внутри делают кэш исполняемого кода, что приводит к высокой латентности PSV-доступа (5 циклов против 2). И тут уже смотрю где нужно совсем быстро (DSP процедуры с константными множителями), тогда перегружаю таблицу в ОЗУ. А если терпимо, то так и адресую через PSV.

SergP01 27.04.2020 11:44

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244247)
Вы ничего не понимаете в архитектурах контроллеров...
Для Вас, я так понимаю, все контроллеры имеют фоннеймановскую архитектуру.
А они все поголовно - гарварды. Есть advanced гарвард, где код может исполняться из ОЗУ и/или код хотя бы виден как ОЗУ нативно. Но в небольших 8-битных МК ЭТОГО НЕТ ОТ СЛОВА СОВСЕМ.
Поэтому все эти приблуды с memcpy, где сорцом выступает флеш, ни разу не катят. Как, впрочем, и дестинатором... :D А то у Вас и флеш залить хватит "смекалки" через memcpy... ;) Чего уж там...

сталкиваля я с "голым" озу :D
ADSP2191.... там нету ПЗУ программ... оно внешнее... и прога, при старте проца(и выставленных наружных битах) грузится в озу....
и маски-шоу.....
как это было.... стартуем с COM.... заливается загрузчик.... заливается прога для программирования внешнего пзу....стартует...начинает принимать прошивку и заливать во внешнее пзу..... СОМ выдернули(битик другой взвёлся).... загрузчик начал работать из пзу....

здец.... как неудобно.... зато шустро потом работает.... :D

pal1222@yandex.ru 27.04.2020 11:53

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244248)
Какая еще, нахрен, условная компиляция, когда ВСЕ таблицы используются при исполнении кода?
Я написал универсальную void функцию перегрузки таблиц на одно и тоже место в ОЗУ. Я передаю в эту функцию имя таблицы (ее константный адрес) и ее длину в байтах и запускаю копирование через 6-ой канал ДМА, который спецом выделил для этой цели. Запустил и тут же использую буфер как таблицу, потому что ДМА раз в 20 быстрее кода работающего с таблицей в загружаемом буфере.
В dsPIC33F я использовал PSV-доступ, который прямо адресует флеш как ОЗУ, для чего есть макросы подставляющие адрес таблицы как константу при загрузке РОНа как указателя на таблицу.
В dsPIC33E ситуация стала разной, потому что флеш в МК - это узкое место в смысле скорости и внутри делают кэш исполняемого кода, что приводит к высокой латентности PSV-доступа (5 циклов против 2). И тут уже смотрю где нужно совсем быстро (DSP процедуры с константными множителями), тогда перегружаю таблицу в ОЗУ. А если терпимо, то так и адресую через PSV.

Нуу... DMA всё равно сам значение вместо адреса не подставит, а так есть безотбойный способ:
Код:

#include <stdint.h>
#include <stddef.h>
#pragma section = ".text"
const struct CMD_0x42_ANSW
{
  uint8_t sync0[9];
  uint16_t Power;
  uint32_t Friquence;
  uint8_t sync1[9];
  uint16_t Size;
  uint8_t sync2[2];
} CMD_0x42_ANSW_template = {.sync0 = {0,1,2,3,4,5,6,7,0xaa}, .sync1 = {0,1,2,3,4,5,6,7,0xaa}, .sync2 = {1,0xaa}};

 *(struct CMD_0x42_ANSW*)USART_TXBuff = CMD_0x42_ANSW_template;
  (*(struct CMD_0x42_ANSW*)USART_TXBuff).Power = power;
  (*(struct CMD_0x42_ANSW*)USART_TXBuff).Friquence = friquence;
  (*(struct CMD_0x42_ANSW*)USART_TXBuff).Size = offsetof(struct CMD_0x42_ANSW, Size);


besogon 27.04.2020 12:06

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Марк
давно не использовал xc8, но если использовать sdcc, то в pic14/pic16 указатели имеют размерность 24 бит.

вряд-ли в xc8 generic pointer имеет 8бит.

Соответственно нормальный вариант это сделать Ваш указатель, как указатель на какую-то базовую Вашу вещь, а то, что Вы храните в массиве использовать как смещение.

иначе говоря
target_addr = base_addr + offset;

иначе говоря если ram, то базовый адрес RAM + смещение.
если Ваше вот это вот всё, то базовый адрес вот этого вот всего + смещение.

потому как в этой архитектуре нет пространства видимости флеша из ОЗУ - что Вы хотите этим сказать? Я не могу дешифровать, что Вы хотите сказать.

Storage Area Flash там в общем случае есть.

***
Ваши умозаключения, выглядят так, как будто вскоре появится код, который в случае Вашей гибели будет проще написать заново, чем сопровождать.

SergP01 27.04.2020 12:06

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от Марк (Сообщение 244247)
Поэтому все эти приблуды с memcpy, где сорцом выступает флеш, ни разу не катят.

ну... судя по вашей функции- "катят".... только ваш "memcpy" - более медленный....
я и не предлагал во флешь писать...:D
из флеша грузится шаблон, который по сути, в некий участок(который сами можете задать) загрузит ваши стандартные константы -начало и конец передачи и заодно резервируют кусок памяти внутри массива адрес которого вы знаете.... а потом в этот кусок копируете вашу структуру с новыми данными.... у вас там только одно поле вываливается из последовательности байт.

не... ежели хитрый компилятор умеет хаотично располагать поля структуры- тогда- такой подход не прокатит :D

кстати... такой приём.... скопировать кусок массива ( в вашем случае байтовой организации полей)- удобно использовать.... данные пакета приняли.... и сразу ему memcpy по адресу структуры( ну...или DMA).... а потом работаете по полями.... типа не нужно функции, которая по полям распихивает...

Марк 27.04.2020 12:19

Re: небольшой пример на ХС8 для PIC18xxxQ43 (вопрос)
 
Цитата:

Сообщение от besogon (Сообщение 244251)
Storage Area Flash там в общем случае есть.

Нет, нету. Есть некие библиотечные приблуды чтения флеша, которые работают очень медленно, если речь идет о таблицах в цикле их обработки.
ФИЗИЧЕСКИ, КОНКРЕТНО В PIC18, нет видимости флеша иначе, чем через инструкции tblrd* через регистр указателя TBLPTR и регистр защелку TABLAT. Например, в новых PIC16/PIC12 такая видимость есть, даже смещение фиксированное, как в PIC24/dsPIC33 - 0x8000.
Поэтому НАТИВНЫХ способов доступа к константам во флеше мануал ХС8 для PIC18 не приводит.


Часовой пояс GMT +3, время: 15:39.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot