虚拟机联网配置
1月31日
终于把10月份的简单东西给做出来了
虚拟机联网配置
前置知识:一个公网IP通常对应一个路由器,一个路由器下面可以自己分配很多内网IP。公网IP相当于小区,路由器相当于楼栋,内网ip相当于每个楼栋的门牌号
1.开发板
虚拟机联网+ping通板子->要两张网卡,一张桥接以太网静态设置IP,一张设置NAT模式DHCP通过主机代理上网
网卡要设置为桥接以太网网卡,这样在同一个路由器下面才是和电脑,esp8266是同一级的,才能被局域网其他设备被转发,但是这样不能上公网,因为桥接的是板子,加了网关也没有用
网卡是NAT模式的情况下,相当于是电脑的一个附属,IP是主机下的一个子网私有IP啥都行,只能和公网(主机ip代理转发)和电脑通信,不能在被其他设备被发现
两张网卡设置一个网关就可以了,不然系统会在两个网卡之间切换跳跃,导致网络不稳,
2.esp8266
网卡要设置为桥接WIFI网卡,这样在同一个路由器下面才是和电脑,esp8266是同一级的,才能被局域网其他设备被转发,还可以上公网
RTOS驱动资源互斥
注意:在RTOS里面,进行串口发送时,严禁两个任务同时操作发送函数,也就是说如果一个任务操作的时候,只能等这个任务操作完了另一个任务才能来操作串口。所以我们要么加上互斥锁,要么把串口写在同一个任务里面。
否则,一个任务执行的时候另一个任务突然打断执行,更改了串口缓冲区的内容,导致该接收到的数据丢失
RTOS 规范 :
- 驱动必须互斥 :如果一个驱动(如 UART、I2C)可能被多个任务调用,必须加锁(互斥量 Mutex)。
- 独占式设计 :更好的做法是让 一个任务独占 硬件资源。例如,只有 net_task 有权操作 ESP8266,其他任务想发数据,必须通过 队列 把数据传给 net_task ,而不是自己直接调用驱动
RTOS里面,优先级数字越大,优先级越低。数字越小,优先级数越高
在项目中采用消息泵机制,在中断函数里面发出信号队列,再在消息任务里面接收解析的时候

ISR的API调用优先级数字要>=下面的5,只能在优先级低的中断里面调用,不然串口打印要出现断言警示
Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,271
而且串口USART2的任务要在同一个任务里面,不能在两个分别的任务里面,不然的话会修改相同的全局变量 g_uart_rx_frame里面的内容,导致从任务A到B再到A的时候,任务A的数据状态被B改了导致解析失败
任务 A 发出了 AT+MQTTPUB,然后进入 while 循环:“我盯、我等、我循环……”。
Wi-Fi 模块传回了数据 "OK\r\n"。串口 IDLE 中断触发。
中断服务程序 (ISR) 将 g_uart_rx_frame.sta.finsh 设为 1。
【高能瞬间】:这时候,操作系统决定切换到 任务 B。
任务 B 看到 xUartRxQueue 来了通知。
它去读 get_frame(),看到了 "OK\r\n"。
它高兴地大喊一句:printf("MsgPump: OK\r\n");。
最致命的一步:它调用了 atk_mw8266d_uart_rx_restart() —— 也就是把状态位、长度全部抹为 0!盘子被它洗干净了!
系统切换回 任务 A。
任务 A 继续在循环里问:get_frame() 回复我了吗?
由于任务 B 把 finsh 标志位擦成 0 了,get_frame() 会一直返回 NULL。
任务 A 等到最后,认为超时失败,垂头丧气地返回了 ETIMEOUT。
