私は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;
ページングされたRAMのどこかに割り当てられます(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の例に従って、そこに「far」を入れてみました。効果はありません。このPICには64Kがないので、すべてを「near」として再コンパイルする必要があります)
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.cのmain()からのいくつかの呼び出しは次のとおりです。
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)へのキャストも役に立ちませんでした。
最初の3行はコンパイルされますが、MPLABシミュレータで実行すると、関数実装の引数にジブリッシュが発生します。
strcpy行は、コンパイラに「警告[2066]型修飾子の割り当ての不一致」という警告を出します。それがどの割り当てを教えてくれたらいいのにと思います。
私はここで何を間違えましたか?
ありがとう
- リチャード