在使用STM32调试一个模块的时候,我在初始化完成之后,发现程序一直停留在某一个地方,无法进入while主循环中,每一次运行这一个函数,都会出现这种问题。这个函数核心部分是这样的

void atk_8266_apsta_test_get(u8* host,u8* url1)
{
    u8 timex=0; 
    u8 p[30];
    u16 t=999;    
    u16 rlen=0;
    u8 constate=0;    //Á¬½Ó״̬
    atk_8266_send_cmd("AT+CWMODE=3","OK",50);  
    atk_8266_send_cmd(p,"OK",1000);

sprintf((char*)p,"AT+CIPSEND=0,%d",strlen(url1));

atk_8266_send_cmd(p,"OK",200);

sprintf((char*)p,url1);
   atk_8266_send_cmd(p,"OK",200);  // 
   sprintf((char*)p,"AT+CIPSEND=0,%d",strlen(url1));
   atk_8266_send_cmd(p,"OK",200);  
   delay_ms(200);
}

调用的程序如下所示。

u8 host_url1[20]="gxyusan.zztv021.com";
u8 url1[120]="GET /api/HomePage/Getumbrellastatus?umbrella_house_id=2&sign=3 HTTP/1.1\r\nHost:gxyusan.zztv021.com\r\n\r\n";

atk_8266_apsta_test_get(host_url1,url1);

打开Debug设置断点调试之后,发现程序运行到这个函数结尾的时候,一直会出现Cannot access Memory。根据提示应该是找不到while主循环对应的入口地址了。那么合理推测应该是这个程序中的变量影响了之后的主函数的地址,或者说这个函数内部的指针溢出了.

经过一番排查,发现问题就出在指针p上,定义的时候定义为unsigned char p[30];说明这个常指针p指向的字符串的长度为30,但是在程序中出现了

sprintf((char*)p,url1);

这一句将整个url赋值给了p那么p目前装的字符串长度和url一样,有101个,此时已经超出了30的范围,导致原先存放while主循环的地址的那部分内存的内容被修改,可能被修改为一个已经超出单片机内存范围的地址。因此出现了Cannot access Memory。

无法根据指针内容找到程序入口的错误。

解决的方法就是将p指针的空间变大,足够放下url即可。比如,unsigned char p[200].那么程序就可以正常运行。

这里记录一下

c语言中char* p = "Hello";和char p[] = "Hello";的p有什么区别。

这两个表达式的p都是存储字符H的地址的指针。它们的区别是:*p中的p是普通指针,可以进行++、--操作,但它指向的Hello是常字符串,不能修改(就是不能写操作),所以像*(p+1)='x';这样的语句是非法的;但这个p可以指向别处,如有char *s="123";,则p=s;合法。而p[]中的p是常指针,不能++、--操作,也不能指向别处,但它指向的字符串Hello不是常字符串,可以修改,如*(p+1)='x';则是合法的,执行后原字符串就成了Hxllo了

STM32调试出现Cannot access Memory的情况相关推荐

  1. linux c++ 程序运行core,gdb调试显示cannot access memory at address

    如题,在linux环境写的c++程序,运行时core了,gdb调试core文件显示:cannot access memory at address 参考了:GDB调试,遭遇"cannot a ...

  2. 借WS2812 PWM DMA驱动调试浅谈STM32调试思路

    借WS2812 PWM DMA驱动调试浅谈STM32调试思路 ​ 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日 ...

  3. 导致cannot access memory的原因是什么?

    cannot access memory 使用的是keil + gd32f405 在一次我编码单片机FLASH时候,程序就是一直运行的擦除FALSH,写入FLASH.然后再想通过SWD重新烧录程序就无 ...

  4. gdb设置断点出现Cannot access memory at address的错误

    文章目录 1.0 问题描述 1.1 问题复现 2.0 2.1 静态链接库 2.2 动态链接库 2.3 PIC 1.0 问题描述 今天在给一个可执行c程序的entry point address设置断点 ...

  5. 铁电存储器 - Ferroelectric Random Access Memory(FRAM)

    相对于其它类型的半导体技术而言,铁电存储器具有一些独一无二的特性.传统的主流半导体存储器可以分为两类--易失性和非易失性.易失性的存储器包括静态存储器SRAM(static random access ...

  6. php如何知道服务器剩余空间,远程简单地获得每台服务器的cpu与memory使用情况

    需要远程简单地获得每台服务器的cpu与memory使用情况,用python写了一个脚本,发布一个http端口,当浏览器连上时,以json格式提供. 用curl连接时输出: #curl localhos ...

  7. STM32调试过程中出现的问题1:

    STM32调试过程中出现的问题1: -\HARDWARE\KEY\key.c(47): error: #29: expected an expression if(key_up&&(K ...

  8. Cannot access memory at adress 0xbf9

    1.Cannot access memory at adress 0xbf9      开始遇到这种错误不知道怎么解决,前两天也遇到过问题那是因为没有对串口进行打开操作就进行其他的后续操作了,所以在运 ...

  9. c语言debug执行错误,C语言调试出错 0xC0000005: Access Violation.

    C语言调试出错 0xC0000005: Access Violation.0 高手帮忙看看,自学没人教态痛苦了,出点什么错误自己要看好半天. 好像是input函数下姓名互换的问题.帮我改正,谢了.不要 ...

最新文章

  1. asp.net webform 复制窗体代码_逆向分析流氓软件自我复制以及防御思路
  2. 技术图文:03 结构型设计模式(上)
  3. [云炬创业学笔记]第一章创业是什么测试12
  4. keepalived(4)——演练故障出现时keepalived的状态
  5. BootStrap导航栏的使用
  6. java学习笔记(十一)常用类、反射、垃圾回收
  7. 【Android】科大讯飞——语音识别
  8. 步进电机功率计算公式
  9. 【Java面试题】线程的生命周期包括哪几个阶段?
  10. 一日一技:Python + Excel——飞速处理数据分析与处理
  11. 摩尔斯密码输出I LOVE YOU ,SOS
  12. xp提示计算机内存不足,xp系统提示配额不足的解决方法
  13. 【git】------git的基本命令 (此文章转载我的老师 Alley-巷子)
  14. 【函数参数传递】编写一个函数,统计字符串中小写字母的个数,并把字符串中的小写字母转化成大写字母。
  15. iOS逆向工程——获取app素材图片
  16. VS2017中配置QT5.12开发环境
  17. python计算1的平方减2的平方加3的平方减4的平方怎么算_计算1的平方减2的平方加3的平方减4的平方 – 手机爱问...
  18. Elasticserch 5.6到Elasticsearch7.11跨版本升级踩坑记录
  19. 受疫情影响!美国大量科技初创企业要挨饿或倒闭
  20. 【渝粤题库】广东开放大学 财务会计(一) 形成性考核 (2)

热门文章

  1. iOS开发:判断iPhone是否是刘海屏iPhoneX、iPhoneXR、iPhoneXs、iPhoneXs Max等
  2. 单词记忆系统二:音标字符输入(re从字符串中提取音标字符;依序打印音标字符;输入对应序号;替换序号。-> 完成“音标输入”)
  3. linux下编译C++项目
  4. UC 浏览器曝中间人攻击漏洞,官方:已修复,国内版不受影响
  5. 解决Unable to open debugger port错误
  6. 计算机考研考线代和概率论吗,关于考研数学线代和概率论的暑期复习扫尾建议...
  7. 索尼和南卡蓝牙耳机哪款比较好?降噪效果好的蓝牙耳机测评
  8. 福布斯专栏:小米手机难成主流
  9. python求主析取范式_求公式q→(r∧p)的析取范式。
  10. Mybatis中如何实现一对一,一对多的关联查询?