移植MQTT项目Day6

还几天没有更新了,并不是作者半途而废而是因为最近的事情比较多,例如:学校的实验,期末考试,英语六级等等,作者还是要花一些时间搞定这些事情。话不多说,前几天作者写完发送接收AT指令的代码后开始了调试,果不其然,出现了大量的错误,作者一度想要放弃o.o还好最后解决了。下面作者将展示这些错误及解决方法。

一.keil软件的使用错误

1.code size 过大

error:the code size of this image (60874 bytes) exceeds the maximum allowed for this version of the

这是因为keil没有激活不能享有所有权益,激活方法也很简单,本网站有很多资源

2.no read write permission in DEBUG

error 65: access violation at 0x40021000 : no ‘read‘ permission

这是因为debug选项没有设置好,在debug选项最下面的四个选项要修改成你所使用的芯片型号,例如作者使用STM32F103C8T6,那么选项就设置为:DARMSTM.dll和-pSTM32F103C8。如果设置完成后仍然没有解决,那么就强制debug获得read write的权利,可以在debug的 Initialization files 选项中自己添加文件(后缀为.ini)(内容为:map 0x40000000,0x400FFFFF read write)

 3.不能下载程序

插上STLink仍然不能下载,大概是没有选上 Utilities -> Use Debug Driver

4.不能使用逻辑分析仪

MDK 5.36 can‘t add xxx to analyzer

这也是没有选中某些选项:将debug界面的左上角的选项全部勾上即可,另外在debug中要先执行到main函数才可以使用analyzer

二.程序bug

1.RTOS中的中断函数无法使用互斥量mutex,如果使用会进入死循环

int platform_mutex_init(platform_mutex_t* m)
{
	/* strider revise */
    /* !<中断函数中使用mutex会死在死循环中,要使用二进制信号量 */
    m->mutex = xSemaphoreCreateBinary(); //xSemaphoreCreateMutex();
    xSemaphoreGive(m->mutex); //令mutex初始值等于1
    return 0;
}

原因:中断服务函数在中断处理时会中断当前的任务执行,一般情况下中断服务函数需要尽快完成,以便从中断返回到先前运行的任务。由于中断服务函数与任务并发执行,因此在中断服务函数中使用互斥量会引入死锁的风险。例如,如果在中断服务函数中尝试获取一个由xSemaphoreCreateMutex()生成的互斥量,并且该互斥量正在被任务持有,则中断服务函数将无法获得该互斥量并可能导致死锁

 2.同样的,解锁unlock也得使用From ISR的API函数 

/* 在中断函数中要使用xSemaphoreGiveFromISR函数,保证安全 */
int platform_mutex_unlock_from_isr(platform_mutex_t* m)
{
	static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    xSemaphoreGiveFromISR(m->mutex, &xHigherPriorityTaskWoken);
	portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

	return pdTRUE;
}

3.移植printf函数引发的错误

作者尝试移植printf函数,也就是改写 int fputc(int ch, FILE* f)  函数,但没有显示结果,反而在轮询while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) 中死循环。原因:忘了初始化USART1,USART_FLAG_TXE当然是0啦!另外还有勾选Target->Use MicroLIB选项,否则不能改写 int fputc(int ch, FILE* f)  函数。

 做项目和看视频敲代码真的完全不在一个维度,当你亲手做一个项目时,就会遇到很多无厘头的报错,让人抓狂o.o。但是当你解决完这些错误后,你又会觉得自己的水平得到了很大的提升@.@

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值