问题调用PIC C18,参数乱码 - 使用指向结构的指针可能?

时间:2011-08-23 21:25:18

标签: c microcontroller pic pic18

我正在尝试使用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]类型限定符在赋值中不匹配”。如果它告诉我哪个任务会很好。

我在这里做错了什么?

由于

  • 理查德

1 个答案:

答案 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;运营商不包括随身携带。

由于   - 理查德

(我会将此问题标记为删除 - 但请注意它已被标记为收藏,所以不要将其从某人的脚下扫过来)