今天想把ucosii移植到手头的一块AVR128芯片上。
只要有移植经验,其它的问题都比较好解决。但是ICC编译器对于函数指针的处理方式特别怪异,让我大吃苦头,纠结调试了半天!!!
症状:编译通过后,运行时卡死。经在AVR Studio中JTAG硬仿真,发现任务调度不了。最终目光聚焦在移植代码里函数中的一行:
tmp = *(INT16U const *)task; /* (1) ICC compiler handles function pointers indirectly! */
这是取得函数指针指向的函数地址。
一般编译器下直接写成 tmp = task 就可以了,但是“ICC compiler handles function pointers indirectly! ”, ICCAVR编译器对函数指针的处理是间接的(indirectly),函数指针是保存在一个函数入口列表(function table entry)中,该列表位于Flash空间,而不能直接获得。
tmp = *(INT16U const *)task 这样是ICCAVR下特有的获得函数地址的方法,而且使用了const关键字。这里是重点了,这里使用的const关键字要求const指定的代码是放在flash中的,否则也一样无法获得正确的函数地址。这要求在编译器下做以下设置:
选择Project->options,在Compiler选项卡中,Treat 'const' as '__flash' (ba... 这一项要求被选中。
这样设置后,函数指针就会经过查找一个存储在flash中的函数表而间接获得,编译出来的结果才能正确执行。
关键字:ucosii AVR系列 单片机移植
引用地址:
ucosii在AVR系列单片机移植中出现的一个BT的问题
推荐阅读最新更新时间:2024-11-12 20:08
uC/OS II的任务切换机理及中断调度优化
引 言 在嵌入式操作系统领域,由Jean J. Labrosse开发的 C/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。 不管是对于初学者,还是有经验的工程师,uC/OS开放源代码的方式使其不但知其然,还知其所以然。通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。通常,购买RTOS往往需要一大笔资金,使得一般的学习者望而却步;而uC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。
[单片机]
STM32使用UCOSII支持低功耗模式
在不在系统的裸奔的软件中,使用RTC+STOP模式很容易实现低功耗模式,但是在UCOS之类的操作系统,实现这一模式就有点麻烦,最大的问题是任务切换是无法控制的,经常出现唤醒之后程序跑飞的情况。 首先,要把休眠的代码段放在低优先级任务中,不一定是系统自带的空闲任务,也可以是用户自定义的最低优先级的任务。 其次,在休眠代码的前后加上两个指令: //=================================================================================== OSSchedLock(); //禁止任务调度 while(1) { .....//休眠代码RTC+STOP P
[单片机]
STM32F4 定义ucosii到CCM
STM32F4说是有192KRAM 但是很是很坑。192k分为两部分128k普通RAM和64K CCM RAM,CCM只能内核调用,外设无法使用。本来想着192KRAM挺好,结果仔细看悲剧了。但是也不能浪费,可以尝试使用它,把UCOS内核数据放到CCM。网上搜索到一个FreeRTOS的照着他的自己弄了弄。 1.勾选IARM2 确认使用CCM 此时编译程序后打开.map文件会发现使用了CCM但是没有数据定义到这块RAM。同时发现IRAM1内部关于UCOS的存储。 2.打开.sct文件添加如下图代码--UCOS_ii_IARM自己写的,把刚刚在IRAM1中看到的 os_core.o 和os_cpu_c.o文件
[单片机]
学习ucosii操作系统的一点心得
ucos-ii操作系统的优异性能我就不说了,因为专家们说的太多了。非要说的话,只能是狗尾续貂。 我就说说自己对学习ucosii操作系统的一点学习心得。对我而言--非计算机专业的人刚开始接触操作系统是多么的痛苦,毕竟自己的c语言知识全靠自学得来的,况且对汇编语言几乎是一窍不通!学完51单片机以及编程后,曾对朋友吹嘘:c语言至少可以考70分(满分100),那时信心是何其饱满!如今自叹:c语言顶多能考50分(满分100)! 没办法,再难也得学啊!谁叫咱爱上这一口了呢?硬着头皮看呗。资料太多了,简直就是汗牛充栋!管他呢,一篇篇的先过一遍,管他懂不懂。通过对几乎3G内容的过滤,最终确认《嵌入式实时操作系统ucosii原理
[单片机]
移植ucosII到STM32F103ZE(三)
四、 移植过程详解: 1. 初始配置 STM32 的标准外设库 stm32 标准外设库的使用在 stm32f10x_stdperiph_lib_um.chm 中的How to use the Library一节中已有说明: 1) 加载文件:加载库文件和相应启动代码到工程中,这一步在上面步骤里已经做过了。 2) 配置芯片类型:(编译下工程,使头文件加载进工程)打开 stm32f10x.h 文件,在大约的 66-73 行,根据所选芯片类型,去掉相应注释。这里我去掉 STM322F10X_HD行的注释(高密度型的stm32芯片)。对自己选用的芯片到底是属于低密度型、中密度型、高密度型还是互联型
[单片机]
STM32学习笔记---基于UCOSII的EXTI外部按键中断实验
继做了基于UCOSII的IWDG独立看门狗实验后,继续进行第25个实验-基于UCOSII的EXTI外部按键中断实验,此实验在基于UCOSII的IWDG实验基础上添加EXTI而来,三个按键,分别按下串口输出按键信息!在多任务下添加了IWDG独立看门狗。 //EXTI按键任务---------------------------------------- static void Task_EXTI(void* p_arg) { (void) p_arg; while(1) { //看门狗更新设置喂狗操作 IWDGSET(); TESTKEY(); OSTimeDlyHMSM(0, 0, 0, 10); }
[单片机]
ICCAVR下移植于ATMEGA32的UCOSII
费了九牛二虎之力终于把UCOSII移植到M32上了,似乎没有想怪中那么兴奋,只是感觉轻松了许多,因为原本打算是在三个星期前搞定的,想想根本原因是没有把握好调试程序时的一些细节,为了一些不可能的东西在钻牛角尖.... 计算机网络的老师给我们讲过大部人都是"蜗牛"!?,只有少部分人是"老鹰"......"老鹰"可以一下冲上高空,而"蜗牛"只有慢慢地爬,也可以到达山顶.不过我觉得只要蜗牛掌握了正确的方法或许也有机会变成---老鹰!(也许其他的蜗牛们也是这么想的~~) 废话少说了.其实正确的写法是uC/OS-II,u就是micro的意思,为了方便均用UCOSII代替,要移植UCOSII必须要知道编译器的堆栈情况.ICCAVR的堆
[单片机]
STM32-ucosii中的串口中断
C/OS中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。 再看《M3权威指南》2.11.2节与9.11节中讲到Cortex-M3在进入异常时自动压栈。。。。返回时自动出栈,再也不需要汇编语言编写了。也就是说我们可以使用C语言来编写中断服务程序。并且省去了上面程序清单的(1)(5)(6). 其实ucos中的终端和裸奔的中断写法基本一致,只是加了几条语句,如下为串口中断的写法: void USART1_IRQHandler(void) { uint8_t RxData; OS_CPU_SR cpu_sr;
[单片机]