嵌入式学习
文章平均质量分 63
longyu_wlz
在写作、音乐、linux 海滩旁捡拾贝壳的小男孩
展开
-
jlink 突然无法识别芯片的问题
jlink突然无法识别芯片的问题问题描述:使用jlink调试时发现在一段时间的正常工作后,jlink突然不能正常工作的问题。调试芯RT1052,主机-windows 7旗舰版解决流程:检查板子上的电源是否接入,一定要确保使用电源供电。如果板子未接入电源就连接好jlink,并将jlink的usb口接入到电脑上,这时,由jlink给板子供电。极容易烧坏jlink与开发板芯片。重新插入jli...原创 2018-10-01 16:51:06 · 16016 阅读 · 1 评论 -
memset 异常行为问题
memset 是一个常用的函数,一般在创建动态内存后,调用 memset 来将内存清空,避免因为内存中的残留信息造成问题。memset 函数原型入下 void *memset(void *s, int c, size_t n);这里需要注意设置内存大小的参数 n 类型为 size_t,一般是 int 型。下面是一个使用的例子p_buf = &_vrammemset(p...原创 2019-05-14 21:30:30 · 1952 阅读 · 0 评论 -
浅谈驱动开发
驱动开发在很多人眼中都是一项极具挑战性的任务,可当你真正去开发一个驱动时,你也许会发现它并没有看上去那样困难,可对大多数人而言驱动开发是八竿子打不着的话题,故而更增强了驱动开发在许多人心中的神秘感。驱动是操作系统控制硬件的接口,它直接与硬件及操作系统打交道。下面我将从硬件与操作系统两个方面描述驱动开发的大致内容。1. 驱动与硬件驱动中对于硬件的控制主要通过配置寄存器来完成。这一过程可能十分复...原创 2019-06-24 07:43:24 · 5225 阅读 · 3 评论 -
嵌入式中 gui 显示单缓冲、双缓冲、三缓冲的原理
gui 中的显示功能gui 中的显示最终通过调用底层的 lcd 驱动提供的接口来将 framebuffer 刷新的屏幕上。framebuffer 的大小与屏幕大小、屏幕分辨率、图片显示方式有关。对与 gui 而言,所有的在调用 lcd 驱动刷新 framebuffer 到屏幕上显示之前都是通过对 framebuffer 的操作完成。这里提及的操作主要使用 memcpy、memset 来完成,这也...原创 2019-07-23 10:33:04 · 2838 阅读 · 1 评论 -
移植实时操作系统到 risc-v 架构芯片时上下文切换的实现
最近在将公司开发的实时操作系统移植到织女星开发板与另外一款国产的 risc-v 架构芯片的评估板上,在移植的过程中我对上下文切换的实现有了更深入的理解,在这里记录一下!1. 上下文切换如何触发ARM 中上下文切换通过触发一个 【pendsv 异常】来进行触发,实际的上下文切换过程由 【pendsv】 的异常处理程序来完成。通常 pendsv 的优先级设定为最低,以优先响应其它中断。在 ris...原创 2019-08-29 10:55:23 · 3545 阅读 · 1 评论 -
嵌入式中使用命令行调试程序
为什么需要使用命令行调试程序大部分时间内我们使用 IDE 中提供的功能就可图形化的调试程序,IDE 为我们屏蔽了调试过程中的一些细节。在一些特殊环境中,我们可能不得不手动使用命令行来调试程序,这时如果事先没有研究过调试的步骤,也许会手忙脚乱。在本文中我就讲下使用命令行调试程序的一般步骤。调试步骤1. 打开一个 gdb server 端我们使用 jlink 调试的时候,通过将 jlink 与...原创 2019-08-30 16:20:21 · 795 阅读 · 0 评论 -
嵌入式中变量被意外修改的调试方法
问题描述在移植公司的实时操作系统到一款国产 RISC-V 架构芯片时,为了测试 systick 中断是否有效,在此中断 isr 中对一个静态变量加一,打断点观察变量的变化来确定中断是否正确执行了!中断 isr 的主要内容如下: isr_handler(void) { }...原创 2019-08-31 06:18:09 · 813 阅读 · 0 评论 -
嵌入式中指定程序执行入口
在 pc 端用 c 语言编写程序的时候,main 函数一般是我们认可的程序执行入口,可实际上在 main 函数之前一些函数已经开始执行,而我们所看到的程序执行起点——main 函数也仅仅只是中间的过程而已。不过 pc 端这样的过程并不容易发现,但是在嵌入式中却暴露无疑。每一个芯片厂家会提供给客户一个启动脚本,这个启动脚本中完成了程序执行环境的初始化过程。在嵌入式开发中程序执行的入口点一般都不是 ...原创 2019-08-31 16:53:19 · 1571 阅读 · 0 评论 -
织女星开发板不能调试
问题描述问题分析复位引脚的问题。未运行程序的问题问题解决使用 telnet 连接来 halt cpu,可能需要执行多次总结原创 2019-09-02 12:51:55 · 202 阅读 · 0 评论 -
ld 链接脚本中标号名称可能造成的问题
问题描述在一款 risc-v 架构的开发板上,访问全局变量的时候出现了异常,调试发现全局变量的地址不正确。查看汇编发现全局变量的访问是通过 gp 寄存器中设定的全局指针加一个偏移量完成的,进一步查看这个寄存器的值,发现值不正确!我的思考gp 是全局指针寄存器,这个寄存器在我之前移植的另一款芯片上并没有使用到,这让我对这个寄存器没有足够重视。不过这个问题应该是 gp 寄存器变量设定的值不对,...原创 2019-09-06 08:44:17 · 208 阅读 · 0 评论 -
实时操作系统中调试上下文切换与中断处理汇编的一些方法
在移植实时操作系统到一款新的板子上时,上下文切换与中断处理是需要用汇编来编写的,尽管可能平时很少写汇编,但是真的写起来其实也没太大难度!可是如果哪个细节没有搞清楚,那么可能会出现特别奇怪的执行过程。这时候最好不要直接调试,最好停下来梳理下整个处理流程,从头到尾审视下自己的处理过程,看看有没有明显的问题。如果没有发现明显的问题,那么就调试一下吧!可是调试上下文切换与中断处理比调试 c 函数要麻烦点...原创 2019-09-07 20:07:44 · 482 阅读 · 0 评论 -
链接脚本中设置标号的问题
链接脚本中设置标号的问题在链接脚本中预留一块区域内存,设置三个标号。第一个标号指向内存的起始地址,第二个标号指向内存的结束地址,第三个标号表示内存的长度。MEMORY { reserved_mem(rw) : ORIGIN = 0x40002000, LENGTH = 1M }PROVIDE(_reserved_mem_start = ORIGIN(reserv...原创 2019-04-12 11:57:34 · 270 阅读 · 0 评论 -
嵌入式中 lst 文件的创建与调试价值
lst文件的创建与调试价值在使用 eclipse 进行嵌入式开发时,有时会遇到程序跳入异常服务程序的情况。这种情况一旦出现,往往让人有点无处着力的感觉。可如果你了解 lst 文件,那么在这种情况下它往往能起到关键的作用。lst 文件实际是使用 objdump 反汇编 elf 文件得到的输出文件,它拥有比 map 文件更详细的信息。如果你的程序中加入了调试信息,那么你可以在 lst 中看到每一条...原创 2018-12-08 13:25:44 · 3699 阅读 · 0 评论 -
嵌入式学习的坑与一些思考
也许对大部分人来说,嵌入式的难点不在于学,而是很难入门。高门槛或许是一些人对嵌入式的最初印象,这个最初印象也是一个门槛。单就个人而言,对嵌入式的理解众说纷纭,在这里我仅仅谈谈我对嵌入式的理解。首先,嵌入式学习容易遇到如下几个“坑”:买开发板时兴趣满满,买回来后发现不能调试,只剩下压箱底。学校开了嵌入式方向,却总让人感觉自己学了个假的嵌入式,没有建立起完整的知识体系,这是一个硬伤。...原创 2018-10-03 20:29:54 · 2219 阅读 · 1 评论 -
关调度与关中断
关调度与关中断关中断与关调度是两种进入临界区的方式,它们有各自的使用环境。最近在研究 ucos-III 的源代码时发现 ucos-III 中有对临界区的优化,以关调度来代替关中断的方式工作。系统可以在特定的情况下用关调度的方式来替代关中断,从而提高了整个系统的实时性。首先,关闭了调度之后就不存在任务间的抢占问题,当前执行的代码只能被中断打断。不同于关中断的方式,关调度的过程中系统仍旧能够正常...原创 2018-10-06 14:42:33 · 2650 阅读 · 0 评论 -
eclipse 导出调试配置信息
使用 eclipse 进行嵌入式开发时,常常需要配置调试选项,而且常常需要配置多个不同的调试类别,如 Debug、Release、flash等等。当需要提供给用户工程文件时,调试信息常常会发生变化,用户需要重新配置调试信息,这样的做法既不安全也不人性化。试想如果一个并不懂调试配置的用户使用你提供的工程时,他会不会被调试配置搞的一头乱麻呢?eclipse 支持将调试配置信息导出到 launch 文...原创 2018-10-13 10:11:45 · 447 阅读 · 0 评论 -
rt-thread 使用心得
#rt-thread使用心得最近做了一个项目,接触到了rt-thread这款国产实时操作系统,进行了简单的配置之后就能够在板子上面调试,确实很方便!下面是我在配置的过程中遇到的一些问题,以及对这些问题的思考。rt-thread驱动与组件初始化rt-thread系统驱动与组件的初始化与常见的嵌入式实时操作系统有较大区别。rt-thread通过将初始化函数地址以不同的初始化级别排序后存储到...原创 2018-10-09 00:10:08 · 6010 阅读 · 0 评论 -
解决未进入中断服务程序的一般思路
解决未进入中断服务程序的一般思路GPIO是否连接GPIO引脚是否配置,支持引脚复用功能的则需要判断是否选定使用的功能检查中断向量表对于支持重映射中断向量表的硬件,检查存储中断向量表起始地址的寄存器的值是否正确当你在程序中对向量表重新进行了映射时,检查起始地址的合法性与复制区域大小,可以读取复制完成后的新中断向量表的首尾中,检查获取到的中断服务程序地址与旧中断向量表中的...原创 2018-10-18 23:45:06 · 2996 阅读 · 0 评论 -
rt-thread 与 ucos 中任务退出时如何调用退出函数
rt-thread与ucos中任务退出时如何调用退出函数rt-thread与ucos中都提供了删除任务的函数,同时系统也支持任务正常终止。相较于死循环的任务执行函数,这是一大改进。任务的创建很容易,也不易产生问题。任务的销毁却十分不易,任务占有资源的释放更是令人头疼。以前我一直调用系统提供的删除任务的函数强制删除任务,这在大多数时间并没有造成太大的问题,但这样的方式其实不太合理。任务删除时必...原创 2018-10-09 19:29:08 · 909 阅读 · 0 评论 -
汇编函数与 c 函数互相调用问题
汇编函数与c函数的互相调用问题从函数定义的角度来看,汇编函数与c函数都是执行流的基本单位,两者没有太大的区别。从操作对象来看,汇编函数中的指令都是直接操作寄存器完成的,c函数中的语句是通过操作变量(可能在寄存器中,大部分时间中都在内存中例如ram、cache)。从c函数调用汇编函数首先需要对汇编函数进行声明,需要注意的是传递给汇编函数的参数所对应的寄存器,以及汇编函数返回值如何获取。在 arm...原创 2018-10-19 12:49:36 · 1957 阅读 · 0 评论 -
rt-thread 中的系统任务
rt-thread中的系统任务实时操作系统中在用户进程创建前系统任务已经创建运行,其中以idle任务最为常见,其它的如统计任务、软件定时器任务等等都是系统任务的实例。最早我学习ucos-II时,我了解到该系统中存在着两个系统任务,分别是空闲任务和统计任务。当系统中无用户任务运行时,空闲任务就会被选中执行,空任务一般没有具体的工作,只是让cpu保持在运行状态,对空闲计数变量加1。ucos-III...原创 2018-10-17 20:53:10 · 681 阅读 · 0 评论 -
unity 单元测试框架的工作原理,及隐含问题
Unity单元测试框架的工作原理,及隐含问题unity 是 github 上的一个开源测试框架,能够很方便的移植到各种不同的嵌入式平台中。unity的主要实现依赖 setjmp 与 longjmp 及 printf 函数。unity 的实现中将不同的测试情况封装为不同的宏,通过调用相应的宏就能够完成对输入条件进行测试。在测试开始时,unity 会调用 setjmp 保存当前栈帧,然后执行初始化...原创 2018-10-22 20:33:52 · 1654 阅读 · 0 评论 -
cpu 分支预测对性能的影响
cpu 分支预测对性能的影响现在的 cpu 一般都支持分支预测功能。维基百科中有以下描述:在计算机体系结构中,分支预测器(英语:Branch predictor)是一种数字电路,在分支指令执行结束之前猜测哪一路分支将会被运行,以提高处理器的指令流水线的性能。使用分支预测器的目的,在于改善指令管线化的流程。现代使用指令管线化处理器的性能能够提高,分支预测器对于现今的指令流水线微处理器获得高性能...原创 2018-10-20 21:41:46 · 1935 阅读 · 0 评论 -
触发 ARM 异常
触发 ARM 异常ARM 处理器有多种类型的异常,如 data abort、prefetch abort、undefine instruction等等。下面是具体的触发方式。1.触发 data abort通过访问地址为空的内存完成2.触发 prefetch aborta. 通过执行一个为空的函数指针来完成b. 通过内联汇编给 pc 赋非指令地址完成3.触发 undefine i...原创 2018-11-30 22:31:23 · 1194 阅读 · 0 评论 -
初始化程序运行的环境
pc 端程序运行的环境的建立过程有很多被隐藏了,而在嵌入式中一般我们都能看到完整的建立过程。这些过程能够让我们更清楚程序执行所依赖的环境,同时也可能会让我们进一步思考这些环境对程序的表达能力的扩展。以 rv32m1_vega 为例!关中断——在临界区内初始化程序运行环境为什么这时候要关中断呢?你可以想想这时候程序执行的环境还没有建立起来,如果产生了中断,那么系统也无法处理,而且中断的优...原创 2019-09-08 12:43:40 · 4099 阅读 · 2 评论