大信
大信 - 认证专家
硬件开发, 软件开发, 系统开发, 工程架构, 方案设计

注册于 2 年前

回答
45
文章
3
关注者
3

优化有很多方法, 主要是看你代码的结构以及指令的类型:
如果你代码有较多的地址访问, 读取常量数据, 那么将代码复制到 RAM 中会有很大的速度提升. 这地地址访问是编译时产生的, 比如复杂结构体的使用, 将造成大量的间接地址的访问.

如果你代码有大量的计算, 特别是浮点计算, 以及三角函数等高级代数的计算, 那么在一些算法下, 想办法, 把算法改造成定点整数的算法, 这样使速度会加快. 如果代码中, 有大量的超函数计算, 那么可以考虑查表法, 不用调用系统的函数库.

另外就是代码指令优化, 分析代码中重复运行比较高的段落, 将此段落编为汇编代码, 然后手动优化汇编代码, 完成代码指令的优化.

使用多种方法, 可以达到提升程序运行速度与效率.

一般直接用 Makefile 即可, 很少在嵌入式上用 cmake. 因为嵌入式开发, 是从最基础的硬件寄存器, 接口上进行操作, 有太多的灵活性, 而且依赖的 SDK 也很少. 不需要一个通用的模板.

因为模块初始化的 MAC 地址都是一样的, 连接路由器后, 路由器根据你的 MAC 计算出动态分配的地址, 也恰好一样了, 你修改一个板子的 MAC, 再连试试看.

段码显示确实没有 DEMO, 因为段码显示没有标准的显示规范, 比如: 一个时间 LCD 屏, 计算器的 LCD 显示屏, 音响的 LCD 显示屏, 空调遥控器的 LCD 显示屏, 都是不通用的, 显示的图形内容也完全不一致, 驱动方法也不一样.

但段码显示原理却很简单, 就是显示单元由一个数字或者图案的各段 和 图案 的位组合而成.

因此你可以根据你所接的段码屏的定义, 分别划分好每个位, 一个位占用一个 IO, 每个位的一个段占用一个 IO, 这样控制 IO 的输出波形从而达到显示的目的. 此时支持把 IO 复用为 GPIO 输出态即可.

举例, 一个 4 位数显的段码屏, 每个为由一个 8 字加小数点组成, 则占用 8 个段的 Io. 有 4 位数, 则再占用 4 个位 IO.

通过动态输出的方式, 输出每个数字, 比如给第一个位输出低电平时, 同时输出段的电平, 然后停留一段时间 (一般 20 毫秒) , 然后给下个位输出低电平, 其它位高电平, 同时输出这个位的段电平. . . . 依次类推, 完成 4 个数字的动态的输出, 反复的来回扫描输出就完成了数字的实时显示. 由于 LCD 液晶具有残影保留和视觉的停留性质, 感觉 4 个数就同时显示出来了.

WIFI 通信信道受干扰, 或者距离太远, 都会使连接中断, 连接中断 socket 也就断了.

wifi 连接是不可靠连接, 你要在应用层, 加上心跳检测, 断线重连的机制, 才能保证业务通讯可用性.

这是在你路由器上做个设置就可以了, 路由器一般使用 DHCP 方式, 即动态分配地址, 给连上的客户端动态的分配地址. 你也可以改为静态地址分配方式, 使用 MAC 地址与 IP 固定绑定的方式. 这样客户端每次连网后的 IP 都是固定的了.

建议你用一个单独的路由器来做实验, 不然影响你全网的地址分配策略.

以你 makefile 为基地址, 检查 user_gpio. h 所在的目录, 是否在 include 的参数里, 不在的话, 加进去.
另外要注意加的位置, 如果加进去, 还不对, 那就把它提前放置.

先用 t-scan 扫描周边可用网络,
用户输入的时候, 如果输入的字符串不在扫描返回的 ssid 列表里, 就提示 "输入的 ssid 不正确"

如果输入的 ssid 正确, 使用 t-connect 联网, 但连不上网, 那就提示 "输入的密码不正确"

Flash 用户参数保存在 flash 中, 可以规划特定的区域.
如果硬件可以自己修改, 那么可以考虑增加单独的存储芯片, 来存储用户参数.

TLS_CONFIG_UDP_ONE_SHOT 宏定义在 w80x_20211115\include\app\wm_wifi_oneshot. h 文件里

define TLS_CONFIG_UDP_ONE_SHOT ONESHOT_ON

t-oneshot 是使用 UDP 配网, 板子向路由器发起底层的组播, 附近的所有 wifi 热点都会收到这个消息.
这时需要一个手机客户端同来来回应这个组播, 客户端上输入这个热点的 ssid 和 密码, 通过回应主播传给板子, 板子再使用收到 ssid 和 密码来连接 AP
当板子连上 AP 时, 手机客户端也会显示所有连接成功板子的 mac 地址和 ip 了. 后面手机客户端就可以跟板子通讯了.

这个客户端, OneShotConfig_2. 0. 0. apk , 只有 android 版本, 需要的自取:

链接: https: //pan. baidu. com/s/1pdkkDXCjsRn67E94eZ9HMg
提取码: uieb

因为串口收发数据, 没有开始结束的标志. 因此发送一段命令, 是否结束, 需要靠解析命令的格式来进行. 这也就是为什么很多 GPS, GPRS, 4G 通信模块 使用 AT+ 指令的接口, AT 就是一个命令的开头, 按一定的格式, 来判断是否接收到了完整的命令, 这种常使用 ASIC 编码通信.
还可以通过时隙来判断, 比如, 收发端约定, 两个命令间隔必须大于 0. 5 秒, 那么只有超过 0. 5 秒时, 才去判断指令是否发送完毕, 这种模式一般跟第一种一起用. 因为很多链路不保证通信速率, 因此可能造成通信延迟.
这也就是很多 AT 指令设计了回应口令的机制. 即, 发送端发送一个命令后, 接收端如果接收完整, 那么回应一个 OK, 发送端如果没收到这个回应, 那么发送端将尝试重发. . . .
另外可以通过, 在指令前后加一个校验, 比如包格式, 内带长度, CRC, CHEKKSUM 等信息, 来校验指令的完整性, 这个一般用在可靠性要求高的通信上, 常用二进制数据通信.

这样, 通过通信过程的控制个约定机制, 来保证发送数据的完整和可靠.

我在公网搭建了一个 websocket 的服务, 开发板可以与它通信, 通过业务层协议, 可以实现多个开发板间的通讯, 开发板一对一, 开发板一对多, 对网页客户端的多种通信模式.

网页客户端地址:
http: //111. 229. 119. 117/w80x/websocket. html

开发板连接地址 ws: //111. 229. 119. 117: 8084
IP: 111. 229. 119. 117
端口: 8084

以上服务为技术研发测试服务, 请勿发送无关信息, 违者进黑名单 .

不会的.

这是消息发送函数, 发消息的数据打包发送到队列里, 在队列处理后, 会释放的.
具体释放的地方是在这里:

W801\w80x_20211115\platform\sys\tls_sys. c: 356

void tls_sys_task (void *data)
{

u8 err; 
struct tls_sys_msg *msg; 
u8 auto_reconnect = WIFI_AUTO_CNT_OFF; 

//u8 oneshotflag = 0; 
//u8 auto_mode = 0; 
for  (; ; ) 
{
    err = tls_os_queue_receive (msg_queue,   (void **)  &msg,  0,  0) ; 
    if  (! err) 
    {
        switch  (msg- msg) 
        . . . 
        
                         break; 
        }
        **tls_mem_free (msg) ; **
    }
    else
    {

    }
}

}

是它内部的 boot 区程序, 在上电时会检测是否有 XMODEM 的 ACK 指令过来, 如果有那么就会拉低 PA0 的电平, 相当于你按下了 boot 键. 于此同时乳沟检测到了 reset 信号, 那么就是开始进入刷机模式, 即按 xmodem 协议接收 img 数据, 并且按 img 的头部的信息写到 flash 的相应区域.
如果上电时, 在一定时间内没有等到 ACK 指令过来, 那么就进入正常启动过程.
总体效果就是免按键进入刷机.

看 tools\w800\wm_tool. c 代码你会明白的. 也可以根据这个代码, 开发自己的刷机程序.

W801 可以使用 wifi 远程升级.
上级方法, 先配网, 可以用 web 配网或者 app 配网.
配网成功, 板子能连互联网后, 可以用 demo 的这个命令来在线升级:
t-httpfwup= (http: //xx. xx. xx. xx/WM_W600_SEC. img)

这里给你一个我搭建的测试服务器地址:
t-httpfwup= (http: //111. 229. 119. 117/w801_v04. img)

发布
问题