【问题标题】:Contiki Cooja error "Executing MSP430X instruction but MCU is not a MSP430X"Contiki Cooja 错误“正在执行 MSP430X 指令,但 MCU 不是 MSP430X”
【发布时间】:2018-12-15 15:50:50
【问题描述】:

我在 Contiki 上的 Cooja 模拟器中运行代码,我收到以下错误消息:

执行 MSP430X 指令但 MCU 不是 MSP430X

我想广播一个名为ReqMsg 的结构。 structure.h 文件定义如下:

   typedef struct {

    int id ;

    int t1 ;

    int t2 ;

    char op[4];

    char E[2][2][4];

    char S[2][2][4];

    char type[20];

}EventPattern; 

typedef struct {

    int id;

    EventPattern epin;

    EventPattern epout;

    EventPattern epresolved;

    int remainEnergy;

}ReqMsg;

我给ReqMsg r 赋值如下:

    EventPattern ep1 = {1, 1, 20,{{"a"} , {"b"}} ,{"seq"},{{"seq","a"},{"seq", "b"}}, "re"};
    EventPattern ep2 = {2, 1, 20,{{"a"} , {"b"}} ,{"seq"},{{"seq","a"},{"seq", "b"}}, "re"};
    EventPattern ep3 = {3, 1, 20,{{"a"} , {"b"}} ,{"seq"},{{"seq","a"},{"seq", "b"}}, "re"};
    ReqMsg r = {1, ep1, ep2, ep3, 5};

为了广播 ReqMsg,我使用了 packetbuffer,如下所示:

    const ReqMsg *req = &r;
    const void *reqAdd = &req;
    packetbuf_copyfrom(reqAdd, 6);
    broadcast_send(&broadcast);

我将packetbuf_copyfrom 宏中的buflen 参数更改为8、10、255 和3512。所有值都相同的错误消息。模拟中的Contiki错误日志为:

    Executing MSP430X instruction but MCU is not a MSP430X
    Stack Trace: number of calls: 2 PC: $00002
    InterruptVectors (memset.c) called from PC: $062ca (elapsed: 5)
    rtimer_run_next (memset.c) called from PC: $05b38 (elapsed: 24)
    *** Interrupt 6 from PC: $042b8

java 错误日志是:

    org.contikios.cooja.ContikiError
at org.contikios.cooja.mspmote.MspMote.execute(MspMote.java:341)
at org.contikios.cooja.mspmote.MspMote.execute(MspMote.java:298)
at org.contikios.cooja.motes.AbstractWakeupMote$1.execute(AbstractWakeupMote.java:47)
at org.contikios.cooja.Simulation.run(Simulation.java:280)
at java.lang.Thread.run(Thread.java:745)
Caused by: se.sics.mspsim.core.EmulationException: Executing MSP430X 
instruction but MCU is not a MSP430X
at se.sics.mspsim.core.MSP430Core.emulateOP(MSP430Core.java:1079)
at se.sics.mspsim.core.MSP430.stepMicros(MSP430.java:253)
at org.contikios.cooja.mspmote.MspMote.execute(MspMote.java:337)
... 4 more

请帮我解决这个问题。

【问题讨论】:

    标签: c contiki cooja


    【解决方案1】:

    “执行 MSP430X 指令”错误通常在内存损坏时出现,因此 MCU 开始尝试将某些不包含实际指令的内存地址作为指令执行。

    在您的代码中:

    const ReqMsg *req = &r;
    const void *reqAdd = &req;
    packetbuf_copyfrom(reqAdd, 6);
    

    变量reqAdd 包含req 变量的地址。相反,你想设置为变量r的地址,等于req

    const void *reqAdd = req;
    

    更好的想法是简单地做

    packetbuf_copyfrom(req, 6);
    

    packetbuf_copyfrom(&r, 6);
    

    因为没有真正需要额外的变量。

    【讨论】:

    • copyfrom 宏已在 contiki 中定义,签名为 packetbuf_copyfrom(const void *from, uint16_t len)..
    • Conversions to void * are implicit in C。您已经在代码中使用了这个事实,在将值分配给 reqAdd 的行中。
    • 另外,packetbuf_copyfrom 是一个函数,而不是宏。
    • 我不知道宏和函数的区别。我搜索了一下。谢谢
    • 这个答案解决了你的问题吗?如果是,请接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-07-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多