Я пытаюсь сделать довольно простой вызов, используя PICC18.
Используя симулятор MPLAB, я вижу, что аргументы, даже при входе в функцию, полностью искажены.
У меня есть следующий typedef
typedef struct
{
// t_ax25AddressChar callsign[6];
unsigned char callsign[6];
union
{
struct
{
unsigned isRepeated:1; // MSB - 1=repeated
unsigned reserved:2; // Reserved
unsigned ssid:4; // SSID
unsigned isLast:1; // LSB - Is the last address
};
unsigned char value;
} flags;
} t_ax25Callsign;
(Мой список TODO включает в себя разработку порядка, в котором мне нужно указать битовые поля)
Это встроено в дополнительную структуру
typedef struct
{
union
{
struct
{
t_ax25Callsign to;
t_ax25Callsign from;
t_ax25Callsign path[APRS_MAX_REPEATERS];
};
t_ax25Callsign allCallsigns[APRS_MAX_REPEATERS + 2];
} address;
// PID and Control are hard coded for APRS
const char message[APRS_MAX_MESSAGE_LENGTH + 1]; // null terminated message string
} t_aprsPacket;
и размещен где-то в выгружаемой памяти (в main.c)
#pragma udata
static t_aprsPacket s_packet;
Метод, определенный в aprs.h
extern void aprsMakeCallsignPgm(t_ax25Callsign *buffer,
const rom char *callsign, unsigned char ssid);
(Я попытался поставить туда «далеко», следуя примеру string.h. Никакого эффекта - и на этом PIC у меня нет 64 КБ, поэтому действительно нужно перекомпилировать все как «рядом»)
Реализация в aprs.c
void aprsMakeCallsignPgm(t_ax25Callsign *buffer,
const rom char *callsign,
unsigned char ssid)
{
int i = 0;
volatile char ch;
for(i=0; i<6 && (ch = callsign[i]) != 0; i++)
{
buffer->callsign[i] = ch << 1;
}
for( ; i<6; i++)
{
buffer->callsign[i] = (' '<<1);
}
buffer->flags.value = 0;
buffer->flags.ssid = ssid;
}
(Его можно оптимизировать. Лучше сначала заставить это работать. Эта реализация позволяет мне видеть, что находится в ch, когда он проходит по циклу.)
Несколько вызовов из main() в main.c
aprsMakeCallsignPgm(&(s_packet.address.from), "M0RJC", (unsigned char)9);
aprsMakeCallsignPgm(&(s_packet.address.to), "APRS", 0);
s_packet.address.to.flags.isLast = 1;
strcpypgm2ram(s_packet.message, "Hard coded test message");
Это приведение к (unsigned char) тоже не помогло.
Первые три строки компилируются, но при запуске в симуляторе MPLAB выдают тарабарщину в аргументах реализации функции.
Строка strcpy выдает предупреждение компилятора «Предупреждение [2066] о несоответствии квалификатора типа в назначении». Было бы хорошо, если бы он сказал мне, какое задание.
Что я здесь сделал не так?
Спасибо
- Ричард