- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我正在尝试使用 LWIP 和 FreeRTOS 在 STM32f7(NucleoF767zi 板)上启动并运行 UDP 多播套接字。
我已经实现了 LWIP 和 FreeRTOS 中间件,并且看起来工作正常。我还设置了一个 Windows 程序,它将多播消息发送到 239.192.0.4 端口 60003,并在网络上的其他设备上进行了测试,消息是否可以正常接收。但是当我使用 STM32f7 处理器时,一切似乎都工作正常,但它没有收到任何东西。
我使用从类似指南中找到的代码来加入多播组,并且在调试代码时没有出现错误:
int Bind(int sock, uint16_t port) {
//struct sockaddr_in serv_addr;
memset((char*) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
if (bind(sock, (struct sockaddr* ) &serv_addr,
(socklen_t ) sizeof(serv_addr)) < 0)
return -1;
return 0;
}
int JoinGroup(int sock, const char *join_ip) {
ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(join_ip);
ip4_addr_t localAddress = MX_LWIP_Get_IP();//Gets the local IP interface address
mreq.imr_interface.s_addr = localAddress.addr;
;
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*) &mreq,
sizeof(mreq)) < 0)
return -1;
return 0;
}
int MulticastStart() {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
int reuse = 1;
/* Dont know if SO_REUSEADDER is nenecessary doesn't seem to make a difference*/
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &reuse,
sizeof(reuse)) < 0) {
perror("Setting SO_REUSEADDR error");
} else
printf("Setting SO_REUSEADDR...OK.\n");
Bind(sock, 60003);
JoinGroup(sock, "239.192.0.4");
return sock;
// Now you can do recvfrom() in RTOS task.
}
然后我有一个 FreeRTOS 任务,我尝试打印从 recvfrom() 接收到的数据,但 receivevfrom() 仍然被阻止,就像它从未接收到任何东西一样。另外,当我看到我的其他设备正常接收来自多播组的消息时。
void StartLWIPReceiverTask(void const *argument) {
osSemaphoreWait(LWIPsemaphore, osWaitForever); // Wait indefinitely for a free semaphore
int sock = MulticastStart();
char test[256];
memset(&test, 0, sizeof(test));
int addrlen = sizeof(serv_addr);
/* Infinite loop */
for (;;) {
int nbytes = recvfrom(sock, test, 255, 0,
(struct sockaddr* ) &serv_addr, (socklen_t* )&addrlen);
if (nbytes > 0) {
HAL_UART_Transmit(&huart3, (uint8_t*) test, (uint16_t) strlen(test),
1000);
memset(&test, 0, sizeof(test));
}
osDelay(1);
}
}
我设置了以下标志:在 lwipopts.h 中:
#define LWIP_IGMP 1
#define LWIP_IPV4 1
#define LWIP_SOCKET 1
#define LWIP_UDP 1
#define SO_REUSE 1
在 ethernetif.c 中:
netif->flags |= NETIF_FLAG_IGMP; //in low_level_init function
在stm32f7xx_hal_eth.c中:
macinit.PromiscuousMode = ETH_PROMISCUOUS_MODE_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;
我没有收到任何错误,所以我很迷茫,希望此时能得到任何提示。
最佳答案
如果其他人遇到这个问题,我通过创建一个新项目并复制代码并在相同文件中设置相同的标志来解决它。不知道为什么它现在有效,但如果它有效它就有效:)
关于c - 如何使用 LWIP 和 FreeRTOS 让多播在 stm32f7 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716918/
我正在使用 http://www.freertos.org/对于应用程序,但我找不到自启动以来如何获取系统时间。我可以创建一个任务并不断更新计数器,但我认为这不是一件好事,因为调度程序可能会安排我的任
我正在开始使用 freeRTOS。我浏览了 freeRTOS.org 中提供的文档,并对一些演示项目进行了一些练习。我的问题是如何在不使用 win32 端口的情况下安装 freeRTOS(因为它只是一
我正在开始使用 freeRTOS。我浏览了 freeRTOS.org 中提供的文档,并对一些演示项目进行了一些练习。我的问题是如何在不使用 win32 端口的情况下安装 freeRTOS(因为它只是一
当使用依赖于 WFI 指令的无滴答空闲功能时,我在 FreeRTOS 的 Cortex-M 端口中看到以下几行 __asm volatile( "dsb" ); __asm volatile( "wf
我在 Linux 下使用 C 编写了一个应用程序,其中使用自定义结构创建队列。代码运行得很好。现在我想修改该代码以使用 freeRTOS 运行它。这是我第一次接触 RTO。在浏览文档时,我发现 fre
哪些参数定义了 FreeRTOS 中的时间片持续时间,以及如何计算在切换一个任务并切换到另一个任务之前它将运行多长时间。 我找到了 configTICK_RATE_HZ,它设置了每秒的滴答数,但它与任
我开始使用 FreeRTOS,我想要一个中断来抢占任何即将运行的任务并运行我需要关键运行的任务。 有没有办法在 FreeRTOS 中执行此操作? (这是通过任务优先级实现的吗?) 最佳答案 不!以上两
我有 STM32F746ZG Nucleo-144pin 板并使用 STMCubeMx 生成代码。我选择了CubeMx提供的10.0.0版本的FreeRTOS,工具链是SW4STM32。 我做了两个任
我正在学习 freeRTOS。我需要在 PIC32 平台(cerebot Mx7ck)的 freeRTOS 中编写软件中断 ISR 处理程序。我浏览了文档,但没有帮助。请有人帮忙。 最佳答案 您是在寻
FreeRTOS 使用什么样的调度程序? 我在某处读到它是一个运行完成调度程序,但另一方面,我也看到它与并行任务一起使用,所以它不会是一个循环调度程序? 最佳答案 最高优先级的任务被授予CPU时间。如
FreeRTOS 使用什么样的调度程序? 我在某处读到它是一个运行完成调度程序,但另一方面,我也看到它与并行任务一起使用,所以它不会是一个循环调度程序? 最佳答案 最高优先级的任务被授予CPU时间。如
我正在构建一个 FreeRTOS 应用程序。我创建了一个模块,它从另一个模块注册 freeRTOS 队列句柄,当该模块中发生中断时,它会向所有注册的队列发送一条消息。但似乎我能够从队列发送消息,但无法
在 cortex M0 MCU 上的一些 FreeRTOS 演示中 configMINIMAL_STACK_SIZE设置为 60,而其他一些设置为 70。使用 STM32Cube 软件将其设置为 12
我想创建两个在 FreeRTOS 中同时运行的任务。第一个任务将处理 LED,第二个任务将监视温度。我有两个问题: 这段代码会创建两个同时运行的任务吗? 如何在任务之间发送数据,例如:如果温度超过 x
我正在读取 dsPIC30F6014A 上 ADC channel 上的一些数据。为此,我为每个 ADC 实现了一个单独的任务(例如 7 个 channel -7 个任务)。 我只在开始时创建了所有任
我写了一个简单的例子,包括 2 个任务:任务 1 和任务 2。任务 1 的优先级高于任务 2。在任务 1 函数中,我增加了任务 2 的优先级,使其优先级等于 (任务 1 的优先级 + 1)。此外,在任
我有一个任务在 freeRTOS 上运行,我正在检查该应用程序中有多少应用程序堆栈未使用。我看到的是,可用堆栈内存在一段时间后会减少,并在很长一段时间内保持在该值。该任务有一个 while(1) 循环
让一个线程修改原子单元(例如字符)而另一个线程仅读取它是否安全?当然,在允许这样做的环境中,例如 freertos。 我得到了一些执行此操作的代码,它使用 bool (定义为 char)作为信号量,我
我正在使用 ARM Cortex-M4 微 Controller 来开发带有 FreeRTOS 的应用程序。 为了精确计时,我想使用基于中断的计时器。中断具有适当的优先级,因此它应该能够调用 Free
我是 FreeRTOS (ARM CM3) 的初学者,我的问题是: 当你创建一个内部有一些局部变量的任务时,将这些变量存储在 RAM 中,堆栈中(由 main() 使用)就像局部变量的一般情况一样,或
我是一名优秀的程序员,十分优秀!