发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结。后续有新的问题提再继续补充。

1、CMSIS版本导致的问题

问题现象一般如下图所示,编译后报错,Undefined symbol __get_IPSR (找不到 符号__get_IPSR )。

分析:该问题一般出现在stm32f103系列的单片机使用标准库移植的情况下。F103系列单片机标准库只更新到3.5版本,cmsis版本较低。

内核相关的文件中缺少 __get_IPSR 函数。

解决办法有三种:

1、将标准库替换成HAL库。(代码改动大,有些人可能不愿意。但hal库是趋势,建议大家及早准备)

2、从mdk安装目录中复制最新的cmsis文件出来,替换掉当前工程目录下的文件。

即将MDK安装目录下 Packs\ARM\CMSIS\5.5.1\CMSIS\Core\Include 目录下的头文件,复制到当前工程目录下CMSIS头文件路径下。

3、将liteos源码中arch\arm\common\cmsis 目录下的文件,复制到当前工程目录下CMSIS头文件路径下。

2、无法下载和调试代码

问题现象一般是:首次下载代码后,无法进行调试,找不到器件;有的情况下也无法再下载程序。

分析:该问题一般是由于使用STM32CubeMX生成裸机工程导致的。在配置时,没有使能Debug功能,导致调试接口禁用。

解决方法:配置时,要使能串行调试功能(如果使用的是SWD接口)。如下图:

如果由于禁用了SWD导致已经不能下载程序了,那么需要先按住CPU的复位,然后再点击下载程序。

3、没有重定向printf导致程序死掉

内核在运行过程中,有时会打印一些日志,打印函数使用的是printf。

因此,如果没有重定向printf函数,那么会导致程序死掉。或者,你可以关闭日志打印功能,不使用printf函数。

重定向printf的示例代码如下,需要勾选使用微库:

///重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到USART1 */
UART_SendByte(USART1, (uint8_t) ch);
return (ch);
} ///重定向c库函数scanf到USART1
int fgetc(FILE *f)
{
/* 等待串口1输入数据 */
while((USART1->SR&UART_FLAG_RXNE)==0);
return (int)USART1->DR&0xff;
}

4、关于OS是否托管中断

个人建议在移植的时候选择OS不托管中断(LOSCFG_PLATFORM_HWI 定义为 NO)。

如果选择OS托管中断(LOSCFG_PLATFORM_HWI 定义为 YES),那么移植相对比较复杂:

1.需要修改启动文件,将通过DCD指令开辟的中断向量表删除;

2. 同时,要修改sct文件,加入中断向量表存储地址相关的内容。

写程序时,应在内核初始化之后,再使用 LOS_HwiCreate 创建中断,绑定中断处理函数。

在内核初始化之前调用LOS_HwiCreate 是无效的,切记。

5、关于时间片轮转

如果 LOSCFG_BASE_CORE_TIMESLICE    定义为 NO ,关闭时间片轮转,则任务无法按时间片方式调度。

即:当任务优先级相同时,若任务不主动阻塞自己,则不会触发进行任务调度。表现为:如果创建了两个相同优先级的任务,则其中一个任务会一直占用 CPU,另外一个任务无法得到执行。

6、其他问题

其他问题,大家可以按如下方式排除:

1、排除配置问题,可以对比target_config.h中的宏定义,找出自己是否有配置不对的地方

2、在线调试,日志打印等。

至于使用问题,可以仔细阅读官方教程,还是蛮详细的。

在实际项目过程中,总会遇到各式各样的问题,大家需要掌握调试手段,善于解决问题,提高自己的能力!

作者:llb90

往期文章精选

如果让你手写个栈和队列,你还会写吗?

挑战10个最难的Java面试题(附答案)【上】

javascript基础修炼(13)——记一道有趣的JS脑洞练习题

【我的物联网成长记3】如何开发物联网应用?

【HC资料合集】2019华为全联接大会主题资料一站式汇总,免费下载!

对你没有看错!不到 10 行代码完成抖音热门视频的爬取!

Python面试的一些心得,与Python练习题分享

最新文章

  1. Struts2+Spring+Hibernate框架整合总结详细教程
  2. ARC 与非 ARC 之间那些的'祸害'
  3. Object类的toString方法
  4. 邮件开发——base64账号密码转换
  5. Git错误non-fast-forward后的冲突解决(转载)
  6. __attribute__机制介绍
  7. java 读取文件到String(解决中文乱码)
  8. Github Atom
  9. NET Socket服务编程
  10. 2016年团体程序设计天梯赛-决赛 L1-7. 到底是不是太胖了(10)
  11. [转载] gitbook安装与使用
  12. java之简单工厂模式详解
  13. [LeetCode] K-diff Pairs in an Array 数组中差为K的数对
  14. 浅谈C++的智能指针
  15. Spring详解(八)------事务管理
  16. 04-基本的mysql语句
  17. 字符串日期转化以及yyyy-MM-dd HH:mm:ss大小写解释
  18. poj1292
  19. [Link]Gearman分布式任务处理系统
  20. JSP九大内置对象辨析

热门文章

  1. 用css和js实现侧边菜单栏点击和鼠标滑动特效
  2. 20190630模拟赛B(单调队列优化dp)
  3. JDK下载安装配置教程(详细)
  4. Vue基础系列(三)——Vue模板中的数据绑定语法
  5. egret Tiledmap编写障碍物的思路
  6. Dart编程语言从基础到进阶1
  7. Linux系统中nc工具那些不为人知的用法
  8. java编程思想第四版第八章习题
  9. lqb 基础练习 十六进制转八进制 (字符串进行进制转化)
  10. nyoj 803-A/B Problem