This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E401Y:lwIP 库中出现硬故障、尝试实现 MODBUS

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP432E401Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1432560/msp432e401y-hard-fault-in-lwip-library-trying-to-implement-modbus

器件型号:MSP432E401Y

工具与软件:

您好!

我正在尝试在 MSP432E401Y 上的一个项目中实施 Modbus。  我以 lwIP 中的 HTTPD 代码为例、创建了一个相当简单的处理程序和回调集。

如果我运行代码、系统将在接受连接后崩溃(我使用命令"telnet 502"(用于生成连接)。  我已经尝试单步执行代码、但如果它在调试器中单步执行、则不会发生硬故障。  特定的硬故障是故障地址为0x99200111的精确总线错误。  我是否有办法尝试找出导致此错误的代码?


我的虚拟服务器实现如下所示:

/**
 * Data has been received on this pcb.
 * For HTTP 1.0, this should normally only happen once (if the request fits in one packet).
 */

static err_t MOD_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err){

	USB_Send_String("MODBUS: recv();");

	if(p->next != NULL){

		USB_Send_String("MODBUS: Multi-payload over capacity;");

		return ERR_MEM;
	}

	struct MOD_Frame * frame = (struct MOD_Frame*) p->payload;


	switch(frame->function){

		case MOD_FUNC_READ_COILS:
			USB_Send_String("MODBUS: Read Coils;");
			break;
		case MOD_FUNC_READ_DISCRETE:
			USB_Send_String("MODBUS: Read Discrete;");
			break;
		case MOD_FUNC_READ_REGISTER:
			USB_Send_String("MODBUS: Read Register;");
			break;



	}


	return ERR_OK;


}


static void MOD_err(void *arg, err_t err){
	USB_Send_String("MODBUS: err();");
}

/**
 * Data has been sent and acknowledged by the remote host.
 * This means that more data can be sent.
 */
static err_t MOD_sent(void *arg, struct tcp_pcb *pcb, u16_t len){
	USB_Send_String("MODBUS: sent();");
	return ERR_OK;
}

/**
 * The poll function is called every 2nd second.
 * If there has been no data sent (which resets the retries) in 8 seconds, close.
 * If the last portion of a file has not been sent in 2 seconds, close.
 *
 * This could be increased, but we don't want to waste resources for bad connections.
 */
static err_t MOD_poll(void *arg, struct tcp_pcb *pcb){
	USB_Send_String("MODBUS: poll()");

	return ERR_OK;
}


err_t MODBUS_accept(void *arg, struct tcp_pcb *newpcb, err_t err){

	if ((err != ERR_OK) || (newpcb == NULL)) {
		USB_Send_String("MODBUS: Error in Accept;");
		return ERR_VAL;
	}

	USB_Send_String("MODBUS:  Accepted Client;");

	tcp_setprio(newpcb, 1);

	tcp_arg(newpcb, NULL);


	/* Set up the various callback functions */
	tcp_recv(newpcb, MOD_recv);
	tcp_err(newpcb, MOD_err);
	tcp_poll(newpcb, MOD_poll, 4);
	tcp_sent(newpcb, MOD_sent);

	delay_ms(100);

	return ERR_OK;

}


void init_MODBUS(){

	USB_Send_String("MODBUS: Init;");

	//Initialize TCP server
	struct tcp_pcb* conn = tcp_new_ip_type(IPADDR_TYPE_ANY);

	if(conn == NULL){
		USB_Send_String("MODBUS: tcp_new failed;");
		return;
	}


	tcp_setprio(conn, 1);	//Modbus has higher priority than HTTP...


	int err = ERR_OK;
	char errbuf[64];



	tcp_arg(conn, (void*)0);

	err = tcp_bind(conn, IP_ADDR_ANY, (502));

	if(err != ERR_OK){
		snprintf(errbuf,64,"MODBUS: TCP Bind Failure: %i;",err);
		USB_Send_String(errbuf);
		return;
	}

	conn = tcp_listen(conn);


	tcp_accept(conn,MODBUS_accept);

	USB_Send_String("MODBUS: Init Succesful;");

}



关于为何无法按预期工作、你们都有什么建议或想法吗?  感谢你能抽出时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    具体的硬故障是故障地址为0x99200111的精确总线错误。

    0x99200111在此处理器的存储器映射中不是有效地址。 因此、非法地址将导致总线故障、从而使处理器进入异常状态。 您是否分配了足够的堆栈? 我建议您增加堆栈大小以查看问题是否消除。  什么是 USB_USB?Send_String 该函数是用于通过 UART 或 USB 发送文本字符串吗?

    本应用手册  诊断 与 MSP432E 芯片相同的 TM4C129 MCU 在 StellarisRegistered微控制器中的软件故障将有助于找到导致故障生成的指令。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我没有听到你的声音。 我现在将结束该主题。 如果您有任何更新、您可以写入此帖子、并且状态将更改为"打开"。