• 回答数

    3

  • 浏览数

    110

鼠宝宝zhz
首页 > 期刊论文 > ucos移植毕业论文

3个回答 默认排序
  • 默认排序
  • 按时间排序

tracy07280917

已采纳

在移植的时候 尽量保证得到的源代码改动最少 并且调试方便 而且目录结构分类清晰网上的各个项目都有如下特点: 1:一来就吭哧吭哧修改头文件,每个文件都#include "includes.h" 2: ucos和其他文件 或者放在一个文件夹 或者在项目里面不管3721都加上 跳来跳去头都是大的 而且调试的时候出些莫名其妙的问题:比如 设不了断点 或者调试无法进入c文件等等我的设想:前提 得到ucos2.84 1: 改动尽量少 即不按常规修改里面的#include "includes.h"等 ucos说放哪里我们就放哪里 2: 项目结构和文件存放结构合理,该有的有 不该有的就没有 3: 调试时编译器不会出现怪问题 4: 文档尽量清楚 每处和每步小小的修改都要说明建议最开始看完 杨屹 大虾的文章[里面的os_cfg_r.h->改成os_cfg.h] 至此,是ucos里面的[第一处修改]1: 建立项目文件 拷贝原始文件 整理文件夹目录如下: FirstVersion: 根目录 project.uv就放下面 -ucos : 拷贝ucos2.83源代码和os_cpu_a.a51 等凡是ucos相关的到下面 去掉只读和存档属性 自己加一个app_cfg.h(ucos2.83增加的) 里面内容是#include 嘿嘿 -output: 项目设置: -SourceGroup ->STARTUP.A51 main.c --ucos ->os_task.c os_core.c2: 设置 1: Target1 -> options->output和Listing里面点"Select Folder for Objects" 改为\output 2: Target1->options -> C51和A51里面的 Include Paths->加入ucos 4: Target1 -> options->Target的MemoryModel和CodeRomSize都用Large编译: 有四个警告 'OSIntCtxSw': missing function-prototype 'OSStartHighRdy': missing function-prototype 'OSCtxSw': missing function-prototype UCOS\OS_CORE.C(1356): warning C275: expression with possibly no effect 第四个警告是由于OS_TaskIdle()里面 (void)p_arg; /* Prevent compiler warning for not using 'parg' */ 没有起到作用 改成p_arg = p_arg;即可。 至此,是在ucos里面的[第二处修改]3:加入 OS_CPU_C.C 不要问这个文件哪里来的 地球人都知道 在不管它通不通前 还有修改 1: 最前面保持跟其他.c文件一致 加入#ifndef OS_MASTER_FILE#include #endif2:加入若干个函数的函数体 大体都是带"hook"的, 这些个函数只在ucos_ii.h有个声明,但由于只有头文件有定义没有函数体 ,keil会把它编译成LJMP STARTUP1的语句。知道有什么后果了吧注意#if的条件头文件和c文件要一致 在这里感觉ucos是不是搞了点”技术处理“?反正n个函数头文件和c文件的#if条件不一致一不小心会造成LJMP STARTUP1! 注意把os_core.c ucos_ii.h和os_cpu_c里面都要改完至此,是在ucos里面的[第三处修改] 要改的地方还不少//in ucos_ii.h#if OS_CPU_HOOKS_EN void OSInitHookBegin (void);void OSInitHookEnd (void);void OSTCBInitHook (OS_TCB *ptcb);void OSTaskCreateHook (OS_TCB *ptcb);void OSTaskDelHook (OS_TCB *ptcb);void OSTaskStatHook (void);void OSTaskIdleHook (void); #endif#if OS_TASK_SW_HOOK_EN void OSTaskSwHook (void);#endif#if OS_TIME_TICK_HOOK_ENvoid OSTimeTickHook (void);#endif 4: 现在开始改OS_CPU_C.C里面的函数 将OSTaskStkInit()改成跟ucos_ii.h里面一样。具体就是原来里面yy大虾的函数是void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) 总之网上各个版本都是ppdata..呵呵 。ucos2.83里面用的是p_arg.我们把它修改成OS_STK *OSTaskStkInit (void (*task)(void *p_arg) , void *p_arg, OS_STK *ptos, INT16U opt) 编译能通过 先不管运行起来对不对5: 在ucos组里面加入os_cpu_a.a51 不要问这个文件哪里来的 地球人都知道编译 会出现错误: *** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH 这是因为os_cpu_a.a51里面 EXTRN IDATA (OSTCBHighRdy) EXTRN IDATA (OSRunning) EXTRN IDATA (OSPrioCur) EXTRN IDATA (OSPrioHighRdy) 对引用的外部变量作了idata的定义,而ucos_ii.h里面没有在这里 os_cpu.h里面 先增加一个#define DATATYPE_1 idata在ucos_ii.h找到这四个变量 增加idata定义 至此,是在ucos里面的[第三处修改]编译能通过6:在ucos_ii.h里面#if 0void OSStartHighRdy (void);void OSIntCtxSw (void);void OSCtxSw (void);#endif这就是造成上面的其中三个编译警告的原因 既然ucos2.83里面有说* IMPORTANT: These prototypes MUST be placed in OS_CPU.H那么我们就把它们placed in OS_CPU.H 不改动原来的代码 只copyvoid OSStartHighRdy (void);void OSIntCtxSw (void);void OSCtxSw (void); 到os_cpu.h里面 再编译 现在就只有*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的警告了Program Size: data=84.0 xdata=2348 code=8721 //keil 8.06至此 整个框架就搭起来了 下面就来慢慢对付OSTaskStkInit()这个函数gogogo!!!!!!!!!!!!!!!!!!1: os_cfg.h里面先 disable掉OS_DEBUG_EN OS_FLAG_EN OS_MBOX_EN OS_MEM_EN OS_MUTEX_EN OS_Q_EN OS_SEM_EN 等等等等 题外话: 做一个Configuration Wizard的OS_CFG.H 这下方便多了 。这可是个体力活! 嘿嘿 也不违背了不改动原始文件的初衷开始go了。建立最简单的一个东西#include void main(void){ OSInit(); OSStart();}发现走到os_cpu_a.a51里面的OSStartHighRdy: USING 0 ;上电后51自动关中断,此处不必用CLR EA指令,因为到此处还未开中断,本程序退出后,开中断。 LCALL _?OSTaskSwHook --》一call就call复位了 我靠捣鼓了下建一个os_cpu_a.c 加入工程 且右键的options->Generate Assembleer SRC File打勾内容为#ifndef OS_MASTER_FILE#include #endif void OSStartHighRdy(void) { OSTaskSwHook(); } 看了看 生成的东西是这样的 ?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE EXTRN CODE (OSTaskSwHook) PUBLIC OSStartHighRdyRSEG ?PR?OSStartHighRdy?OS_CPU_AOSStartHighRdy: USING 0 LJMP OSTaskSwHook END简直莫名其妙 于是 将os_cpu_a.a51改成 ;EXTRN CODE (_?OSTaskSwHook) EXTRN CODE (OSTaskSwHook) ;keil8.06 <-----改这里;子程序;------------------------------------------------------------------------- RSEG ?PR?OSStartHighRdy?OS_CPU_AOSStartHighRdy: USING 0 ;上电后51自动关中断,此处不必用CLR EA指令,因为到此处还未开中断,本程序退出后,开中断。 ;LCALL _?OSTaskSwHook LCALL OSTaskSwHook <-----改这里再测试 ok 能进入OSIdleStask 并在里面循环 看来是c和汇编连接的一些问题 先把它放一边以后解决 [待解决的问题2]继续测试 这里又想到个问题 万一#define OS_TASK_SW_HOOK_EN 0 那么OSTaskSwHook()就不被编译。在汇编里面调用会不会又复位?keil这点太……[不知道哪里可以设置 待解决的问题2],测试了下 果然复位 我靠!作个说明“如果用keil,那么OS_TASK_SW_HOOK_EN 一定要为1好了 就算第一步测试搞定 现在来做个”笨活路“ 给所有的函数加上reentrant! 内部的static就不用了。现在开始调试serial 将yy大虾的serial.c搞过来 加入工程1: 看到汇编和c混合头都是大的 把#pragma asm push IE EA = 0;之类的东东全部改成 _push_(IE); EA = 0;嘿嘿 当然不要忘记在app_cfg.h加#include 现在有:#include void Task1(void *p_arg) keilReentrant;void Task2(void *p_arg) keilReentrant;void Task3(void *p_arg) keilReentrant;OS_STK Task1Stack[MaxStkSize];//注意:我在ASM文件中设置?STACK空间为40H即64。OS_STK Task2Stack[MaxStkSize];OS_STK Task3Stack[MaxStkSize];void main(void){ unsigned char ucReturn; OSInit(); OSInitTimer0(); //也就是原来的InitTimer0(); InitSerial(); InitSerialBuffer(); ucReturn = OSTaskCreate(Task1, (void *)0, &Task1Stack[0] ,2); ucReturn = OSTaskCreate(Task2, (void *)0, &Task2Stack[0] ,3); ucReturn = OSTaskCreate(Task3, (void *)0, &Task3Stack[0] ,4); OSStart();}void Task1(void *p_arg) keilReentrant{ p_arg = p_arg; ET0=1; for(;;){ //PrintStr("Task 1 is active. \n"); OSTimeDly(3*OS_TICKS_PER_SEC); }}void Task2(void *p_arg) keilReentrant{ p_arg = p_arg; for(;;){ PrintStr("Task 2 is active. \n"); OSTimeDly(2*OS_TICKS_PER_SEC); }}void Task3(void *p_arg) keilReentrant{ p_arg = p_arg; for(;;){ PrintStr("Task 3 is active. \n"); OSTimeDly(3*OS_TICKS_PER_SEC); }}运行 我靠 怎么就显示"Task 1 is active" 任务不切换 ?为啥。原来os_time.c还没有加到项目里面去(因为这个项目没有把ucos_ii.c加入项目);OSTimeDly()哪里会工作加进去,运行->OKOS_timr 把OS_Timr.c加入 并打开en的开关编译的时候会出现err。原因是回调函数参数太多的问题解决方法见 在ucos-ii.h里面/* add keilReentrant to to solve the Error 212: Indirect call: Parameters do not fit within registers */typedef void (*OS_TMR_CALLBACK)(void *ptmr, void *parg) reentrant ; 附加一点就是项目里面直接加如.a文件 不用在include c51L.lib然后加入一个lcd的驱动 呵呵很简单1602的。前提就是尽量不修改ucos的变量 函数名称和调用方式等详细见工程。调试通过 不过是在proteus里面。在这里感谢jjj 记得因为lcd.c里面用到了sempost函数 所以如果要用就必须把OS_MAX_EVENTS 算进去,在你原来的设定值加一到此 新鲜的ucos2.84出炉了。奉献此身体给大家。想来想去 唯一的卖点就是写了点细节,二是改了个os_cfg.h...呵呵打包文件在下 ! 只有文档的兄台也不用发mail给我 自己网上找去 应该有下 熊伟 于大年初一 深圳 jdsu光电version2: 不知道怎么回事,一到 LCALL OSTaskSwHook --》一call就call复位了 我靠 又改回来 LCALL _?OSTaskSwHook 又好了 想了想 是不是我又加了.a文件的原因?因为后来我又加了一个INT0Function.c 和INT0Function_a.a51void Int0Function() keilReentrant{ //中断在汇编中实现,去掉interrupt {//INT0中断服务子程序}#include NAME INT0FUNCTION_A ;模块名?PR?_?INTOFunction?INT0FUNCTION_A SEGMENT CODEEXTRN CODE (_?INTOFunction);------------------------------------------------------------------------- CSEG AT 0013H ;INT0中断 LJMP INT0ISR ;工作于系统态,无任务切换。 RSEG ?PR?_?INTOFunction?INT0FUNCTION_A INT0ISR: USING 0 CLR EA ;先关中断,以防中断嵌套。 PUSHALL LCALL _?INTOFunction POPALL SETB EA RETI;------------------------------------------------------------------------- END;-------------------------------------------------------------------------

97 评论

loveless0122

下面的都是毕业论文范文,有用的话,请给我红旗LMX2350/LMX2352芯片简介及电路设计基于LMX2306/16/26 芯片简介及应用电路设计 基于LT5500f 的1.8~2.7 GHzLNA/混频器电路设计基于LT5517 40MHZ到90NHZ 积分解调器的设计基于LT5527的400MHz至3.7GHz高信号电平下变频混频器电路设计基于LT5572的芯片简介及应用电路设计基于LT5516的芯片简介及应用电路设计 基于MAX2039的芯片简介及应用电路设计 基于MAX2102/MAX2105芯片简介及应用电路设计基于MAX2106 芯片简介及应用电路设计 基于MAX2323/MAX2325 的芯片简介及应用电路设计 基于MAX2338芯片简介及应用电路设计 基于MAX2511的芯片简介及应用电路设计 基于MAX2685的芯片简介及应用电路设计 基于MAX2753的芯片简介及应用电路设计基于MAX9981芯片简介及应用电路设计基于MAX9994的芯片简介及应用电路设计 基于MAX9995的芯片简介及应用电路设计基于MC12430的芯片简介及应用电路设计基于MC88920芯片简介及应用电路设计基于MPC97H73的简介及电路设计基于MPC9229 芯片简介及应用电路设计 基于mpc9239芯片简介及应用电路设计 基于MPC9992 芯片简介及应用电路设计基于mpc92433芯片的简介及应用电路设计基于TQ5121的无线数据接收器电路设计基于TQ5135的芯片简介及应用电路设计基于TQ5631 3V PCS波段CDMA射频放大混频器电路设计语音信号处理技术及应用网络文档发放与认证管理系统网络配置管理对象分析与应用三维激光扫描仪中图像处理快速算法设计基于分形的自然景物图形的生成图像压缩编码基于奇异值分解的数字图像水印算法研究数字图象融合技术汽车牌照定位与分割技术的研究焦炉立火道温度软测量模型设计加热炉的非线性PID控制算法研究直接转矩控制交流调速系统的转矩数字调节器无线会议系统的设计温度检测控制仪器简易远程心电监护系统基于LabVIEW的测试结果语音表达系统程控交换机房环境监测系统设计单片机控制的微型频率计设计基于DSP的短波通信系统设计(射频单元)等精度数字频率计不对称半桥直直变换器仿真研究基于MATLAB的直流电动机双闭环调速系统无线传输应变型扭矩仪模糊控制在锅炉焊接过程中的应用三层结构的工作流OA的应用与实现基于ANSYS8.0的永磁直线电机的有限元分析及计算音频信号的数字水印技术3.3V低压CMOS零延迟1:11时钟发生器基于ADF4116/4117/4118的芯片简介及应用电路设计ADF4193芯片简介及应用电路设计LMX2310U/LMX2311U/LMX2312U/LMX2313U芯片简介及应用电路设计MAX2754芯片简介及应用电路设计MPC92432芯片简介及应用电路设计高增益矢量乘法器基于400MSPS 14-Bit,1.8VCMOS直接数字合成器AD9951基于900MHz低压LVPECL时钟合成器的电路设计基于 MAX2450芯片简介及应用电路设计基于AD831低失真有源混频器的电路设计基于AD7008的芯片简介及应用电路设计基于AD8341 芯片简介及应用电路设计基于AD8348的50M-1000M正交解调器基于AD8349的简介及应用电路设计基于AD9511的简介及电路应用基于AD9540的芯片简介及电路设计基于AD9952的芯片简介和应用电路设计基于ADF436的集成数字频率合成器与压控振荡器基于ADF4007简介及电路设计基于ADF4110/ADF4111/ADF4112/ADF4113上的应用电路设计基于ADF4154的芯片简介及应用电路设计基于ADF4360-0的芯片简介及应用电路设计基于ADF4360-3电路芯片简介及应用电路设计基于ADF4360-6的简介及应用电路设计基于ADF4360-7的集成整形N合成器的压控振荡器基于ADL5350的简介及应用电路设计基于CMOS 200 MHZ数字正交上变频器设计基于CMOS 的AD9831芯片数字频率合成器的电路设计基于CX3627ERDE的芯片简介及应用电路设计基于CXA3275Q的芯片简介及应用电路设计基于CXA3556N的芯片简介及应用电路设计基于IMA-93516的芯片简介及应用电路设计VPN技术研究UCOSII在FPGA上的移植IPTV影音信号传输网络设计GSM移动通信网络优化的研究与实现 FSK调制系统DSP处理GPS接收数据的应用研究Boot Loader在嵌入式系统中的应用ADS宽带组网与测试基于FPGA的IIR滤波器设计MP3宽带音频解码关键技术的研究与实现基本门电路和数值比较器的设计编码器和译码器的设计智力竞赛抢答器移位寄存器的设计与实现四选一数据选择器和基本触发器的设计四位二进制加法器和乘法器数字钟的设计与制作数字秒表的设计数控分频器及其应用汽车尾灯控制器的设计交通灯控制器的设计简易电子琴的设计简单微处理器的设计DSP最小系统的设计与开发基于消息队列机制(MSMQ)的网络监控系统基于DSP的电机控制的研究基于数学形态学的织物经纬密度的研究纱条均匀度测试的研究 图像锐化算法的研究及其DSP实现 手写体数字识别有限冲击响应滤波器的设计及其DSP实现 同步电机模型的MATLAB仿真USB通信研究及其在虚拟仪器中的应用设计WLAN的OFDM信道估计算法研究采用S12交换机支持NGN下MEGACO呼叫流程的设计基于语音信号预测编码的数据压缩算法的研究与实现基于小波变换数字图像水印盲算法基于小波变换和神经网络的短期负荷预测研究嵌入式系统建模仿真环境PtolemyII的研究与应用分布式计算环境的设计与实现复合加密系统中DES算法的实现大学自动排课算法设计与实现基于AES的加密机制的实现基于AES算法的HASH函数的设计与应用基于DM642的H.264视频编码器优化和实现基于Huffman编码的数据压缩算法的研究与实现基于internet的嵌入式远程测控终端研制基于Matlab的FMCW(调频连续波)的中频正交处理和脉冲压缩处理 基于MATLAB的对称振子阻抗特性和图形仿真基于windows的串口通信软件设计基于粗糙集和规则树的增量式知识获取算法自适应蚁群算法在DNA序列比对中的应用远程监护系统的数据记录与传输技术研究基于分布式体系结构的工序调度系统的设计基于活动图像编码的数据压缩算法的设计与实现基于宽带声音子带编码的数据压缩算法的设计与实现基于网络数据处理XML技术的设计基于小波变换的数据压缩算法的研究与实现基于小波变换的配电网单相接地故障定位研究及应用英特网上传输文件的签名与验证程序

181 评论

恰恰小资

首先概念你都没有搞清楚,uCOS-II是一个嵌入式操作系统,Keil C(MDK)是一个集成开发环境。所谓的移植,是把嵌入式操作系统移植到一个硬件平台,你不是在一个集成开发环境。还是建议你先看uCOS_II(邵贝贝翻译的)这本书,在网上可以下到,百度一下就有了。在第八章是讲的移植过程,不过建议你还是要先去学习前面的章节。下面是在第八章讲的移植过程:如果用户理解了处理器和 C 编译器的技术细节,移植µC/OS-Ⅱ的工作实际上是非常简单的。前提是您的处理器和编译器满足了µC/OS-Ⅱ的要求,并且已经有了必要工具。移植工作包括以下几个内容: l 用#define设置一个常量的值(OS_CPU.H) l 声明10个数据类型(OS_CPU.H) l 用#define声明三个宏(OS_CPU.H) l 用C 语言编写六个简单的函数(OS_CPU_C.C) l 编写四个汇编语言函数(OS_CPU_A.ASM) 根据处理器的不同,一个移植实例可能需要编写或改写 50 至 300 行的代码,需要的时间从几个小时到一星期不等。 一旦代码移植结束,下一步工作就是测试。测试一个象µC/OS-Ⅱ一样的多任务实时内核并不复杂。 甚至可以在没有应用程序的情况下测试。 换句话说, 就是让内核自己测试自己。

357 评论

相关问答

  • 中华器官移植杂志与中华移植杂志

    共有12个: 1、国际药学研究杂志。 2、生物学教学杂志。 3、中国药物化学杂志。 4、中国妇产科临床杂志。 5、上海医学杂志。 6、中华器官移植杂志。 7、中

    谁是小小 4人参与回答 2023-12-06
  • 有关器官移植的论文

    一、克隆技术的科学意义及经济价值 克隆技术的突破,首先标志着人类对生命的认识水平与改造能力的提高,这本身是人类文明的长足进步。作为生物工程的一项重要成果,克隆技

    虎潜山林 3人参与回答 2023-12-06
  • 人体移植论文

    克隆器官 器官移植可救人于生死之际,现代医学几乎能在所有人类器官和组织上施行移植术,但排斥反应和供体缺乏仍是令人头痛的事。克隆人由于遗传物质全部来源于“原版人”

    虫子郭郭 5人参与回答 2023-12-07
  • 器官移植技术论文

    英国哲学家波普尔曾经说过:「科学进步是一种悲喜交集的福音。」这是一个富有哲理的比喻。回顾人类社会的发展史,我们可以清楚地看到:我们之所以能够在一个世纪里创造出比

    chetcn0948 2人参与回答 2023-12-09
  • 器官移植的分配论文

    这个是可以的啊,什么时间要呢,,,恩

    WaimanTong 5人参与回答 2023-12-07