我正在尝试使用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;
}
(它可以被优化。最好让这个先工作。这个实现让我看到循环中的内容。)
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)也没有帮助。
前三行编译,但在MPLAB模拟器中运行时会在函数实现中的参数中产生乱码。
strcpy行给出编译器警告“Warning [2066]类型限定符在赋值中不匹配”。如果它告诉我哪个任务会很好。
我在这里做错了什么?
由于
答案 0 :(得分:3)
我正在调用一个使用FSR2的汇编程序初始化例程,因此破坏了C堆栈。 我将其更改为使用FSR0而现在可以正常工作。
执行相同操作的较短代码是
void aprsMakeCallsignPgm(t_ax25Callsign *buffer,
const rom char *callsign,
unsigned char ssid)
{
int i;
overlay char *dst = buffer->callsign;
for(i = 6; i && (*dst++ = (*callsign++ << 1)); i--);
dst--; // Rewind that 0. Good job flags is there to save from overrun
for( ; i ; i--) *dst++ = (' '<<1);
buffer->flags.value = (ssid & 0x0F) << 1;
}
我正在编译“调试”模式,所以没有优化。看看它在这种模式下的作用很有用,因为我只有编译器的评估版本。新版本保存了66个程序位置和3个字节的RAM。它还告诉我,位域的正确方法是
struct
{
unsigned isLast:1; // LSB - Is the last address
unsigned ssid:4; // SSID
unsigned reserved:2; // Reserved
unsigned isRepeated:1; // MSB - 1=repeated
};
我拿&lt;&lt;运营商不包括随身携带。
由于 - 理查德
(我会将此问题标记为删除 - 但请注意它已被标记为收藏,所以不要将其从某人的脚下扫过来)