极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12014|回复: 3

使用PROGMEM 定义变量,编译下载没问题,运行出错,有人遇到过吗?

[复制链接]
发表于 2014-5-18 20:20:02 | 显示全部楼层 |阅读模式
参照:
ENC28J60利用ethercard库httpPost函数发送数据到yeelink或者乐联网
http://www.geek-workshop.com/thread-1824-1-1.html


用帖子中给的代码,使用PROGMEM 定义变量放在FLASH中,如char website[] PROGMEM = "api.yeelink.net";编译时没问题,但执行到
if (!ether.dnsLookup(website))
      Serial.println("DNS failed");
就会出现DNS failed
如果改成const char website[] = "api.yeelink.net";就没问题了。我用的是Arduino1.05版本。
请问我的错误是什么原因?
其他人有遇到过吗?
谢谢!
回复

使用道具 举报

发表于 2014-5-18 22:10:52 | 显示全部楼层
本帖最后由 Super169 于 2014-5-18 22:13 编辑

因為不是 syntax 問題, 所以 compile 可以通過的.
但由於 PROGMEM 是用 flash memory, 而一般 data 是用 SRAM.  讀取 PROGMEM pointer 要用別的方式去讀取 (用 pgm_read_byte 一個個讀取), 跟一般的 SRAM pointer 用法不同.
而 char array 是以 pointer 傳送的, 所以執行時如果你本身是 char website[] PROGMEM, 系統會把對應的 flash 地址傳過去, 但讀取時由於這個庫會把它當成是 SRAM 的地址去讀, 自然會讀錯了.

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-18 23:12:13 | 显示全部楼层
Super169 发表于 2014-5-18 22:10
因為不是 syntax 問題, 所以 compile 可以通過的.
但由於 PROGMEM 是用 flash memory, 而一般 data 是用 S ...

谢谢,明白了!讲得很清楚。
还有一个问题,同样是ethercard库,从https://github.com/jcw/ethercard/下载的tcpip.cpp中void EtherCard::httpPost (const char *urlbuf, const char *hoststr, const char *additionalheaderline, const char *postval, void (*callback)(uint8_t,uint16_t,uint16_t)) 而[新人帖]yeelink平台下,LM35温度上传+开关控制LED
http://www.geek-workshop.com/thread-4864-1-1.html
下载的ethercard库中void EtherCard::httpPost (prog_char *urlbuf, prog_char *hoststr, prog_char *additionalheaderline,const char *postval,void (*callback)(byte,word,word)) {
这两个定义为什么不一样?其函数代码完全相同
回复 支持 反对

使用道具 举报

发表于 2014-5-19 00:18:30 | 显示全部楼层
Jone 发表于 2014-5-18 23:12
谢谢,明白了!讲得很清楚。
还有一个问题,同样是ethercard库,从https://github.com/jcw/ethercard/下 ...

由於我沒用過, 我只能從表面的資料猜測.
由於發出 http request 時, 有些東西比較 static, 可以用 flash memory 去儲存而減少 SRAM 的耗用.
但當中的 urlbuf, 字面上看是一個 buffer (buf = buffer 簡寫?), 正常 buffer 是需要在執行中讀寫的, 但再看你提供的連結的代碼, 他的 buf 可能只是用作儲存一些固定的 url.
因此, 他把 urlbuf, hoststr, additionalheaderline 的資料都改成用 flash memory, 函數中用 prog_char* 去讀取 PROGMEM 的資料, 而非 char*.   但 postval 會因應要求不同而改變, 所以保留用SRAM.

兩個函數分別用了 flash 和 SRAM 作參數, 在讀取參數的部份肯定有分別了, 但執行的邏輯可以是一樣的.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 17:21 , Processed in 0.051465 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表