ICCAVR下移植于ATMEGA32的UCOSII
费了九牛二虎之力终于把UCOSII移植到M32上了,似乎没有想怪中那么兴奋,只是感觉轻松了许多,因为原本打算是在三个星期前搞定的,想想根本原因是没有把握好调试程序时的一些细节,为了一些不可能的东西在钻牛角尖....
计算机网络的老师给我们讲过大部人都是"蜗牛"!?,只有少部分人是"老鹰"......"老鹰"可以一下冲上高空,而"蜗牛"只有慢慢地爬,也可以到达山顶.不过我觉得只要蜗牛掌握了正确的方法或许也有机会变成---老鹰!(也许其他的蜗牛们也是这么想的~~)
废话少说了.其实正确的写法是uC/OS-II,u就是micro的意思,为了方便均用UCOSII代替,要移植UCOSII必须要知道编译器的堆栈情况.ICCAVR的堆栈指针是向下增长的,堆栈指针指向SRAM的最高地址.其堆栈还分为软堆栈和硬堆栈.软堆栈是用于寄存器入栈的,而硬堆栈用于的函数地址进出栈的,函数调用或进出中断函数时会用到.软堆栈实际是分布在硬堆栈的下面.软堆栈用Y寄存器作为指针,硬堆栈用SP为作指针.(不知看懂了没.表达似乎不太好...)其实ICCAVR也附带有移植于M103的UCOSII,不过M103跟M32是有区别的.
知道了软硬堆栈就好办了,我的程序是从嵌入式实时操作系统uC/OS-II(第二版)>的实例1直接改过来的,其实例的中8086的SP指针直接用M32的Y寄存器代替,将M32的硬堆栈指针SP保存到软堆栈中,下面是我的一段堆栈初始化的程序:
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
INT16U tmp;
INT8U *stk;
INT8U *hard_stk; //硬件堆栈指针
INT16U stk_tmp; //硬堆栈变量
opt = opt; //防止编译器警告
pdata="pdata";
stk_tmp=(INT16U)ptos; //得到硬堆栈的地址
hard_stk=(INT8U *)ptos;//指向硬堆栈
stk = (INT8U *)ptos-40;//指向软堆栈,40为硬堆栈的大小,ICCAVR的help文档上说过,如果函数不是嵌套很大一般用16就够了,这里我用help文档上说的最大的.
//函数地址入栈
tmp = *(INT16U const *)task;//得到函数地址,这里参考了ICCAVR里面自带的M103的UCOSII源文件.
*hard_stk-- = (INT8U)(tmp); //函数地址入栈
*hard_stk-- = (INT8U)(tmp>> 8);
stk_tmp=(INT16U)hard_stk; //得到硬堆栈的地址
//Rx入栈
*stk-- = 0;
*stk-- = 1;
*stk-- = 2;
*stk-- = 3;
*stk-- = 4;
*stk-- = 5;
*stk-- = 6;
*stk-- = 7;
*stk-- = 8;
*stk-- = 9;
*stk-- = 10;
*stk-- = 11;
*stk-- = 12;
*stk-- = 13;
*stk-- = 14;
*stk-- = 15;
*stk-- = 16;
*stk-- = 17;
*stk-- = 18;
*stk-- = 19; //为了在OS_CPU_A.S文件上方便一点,R20~R23我设置为编译器不使用,这样似乎有点浪费,读者完可以自己改过来.
*stk-- = 24;
*stk-- = 25;
*stk-- = 26;
*stk-- = 27;
*stk-- = 30;
*stk-- = 31;
/*SREG入栈*/
*stk-- =0x80; //PUSH SREG
/*SP入栈*/
*stk-- = (INT8U)(stk_tmp); //sp
*stk = (INT8U)((stk_tmp)>> 8); //sp
return ((OS_STK *)stk);
}
在OS_CPU.H修改相应的定义:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /* Unsigned 8 bit quantity */
typedef signed char INT8S; /* Signed 8 bit quantity */
typedef unsigned int INT16U; /* Unsigned 16 bit quantity */
typedef signed int INT16S; /* Signed 16 bit quantity */
typedef unsigned long INT32U; /* Unsigned 32 bit quantity */
typedef signed long INT32S; /* Signed 32 bit quantity */
typedef float FP32; /* Single precision floating point */
typedef double FP64; /* Double precision floating point */
typedef unsigned char OS_STK; /*堆栈入口为8位 Each stack entry is 8-bit wide */
#define OS_CRITICAL_METHOD 1 #define OS_ENTER_CRITICAL() asm("cli") /*关中断*/
#define OS_EXIT_CRITICAL() asm("sei") /*开中断*/
#define OS_TASK_SW() OSCtxSw();/*暂时直接用函数代替*/
OS_CPU_A.ASM文件直接改成M32相应的汇编,可参考ATMEGA32的技术文档,当然一些伪指令技术文档里面是没有的,可查找相关的书籍.这里也写出来:
对寄存器作定义:
TCNT0 = $32;
SREG=$3F;
SPH=$3E;
SPL=$3D;
定义宏:
.macro XXX //XXX宏的名字
;写指令
.endmacro //宏结束
M32我用了定时器0,感觉这个8位的定时器一般会少用.直接用Tools菜单下的,Application Builder来生成定时器的在4M晶振下产生100HZ的初始值,误差为0.2% .
以下是我在Project option下的设置:
- 嵌入式学习笔记19——AVR单片机之C51向ICCAVR的移植(11-19)
- ICCAVR看门狗(11-13)
- 看了看ICCAVR的库文件,谈几点感想(11-11)
- ICC AVR精确定时的编程实验(11-10)
- ICC AVR 过渡到 AVR STUDIO(11-10)
- ATmega32外部中断嵌套(11-10)
- 婵°倕鍊瑰玻鎸庮殽閸モ晙鐒婇柛鏇ㄥ灱閺嗐儳鈧鎮堕崕鎶藉煝閼测晜鏆滈柛顐g箓閹鏌熺€涙ê濮囬柣鎾规硶閹峰顢橀悢鍛婄暚缂備礁顑呴鍛淬€冨⿰鍛晳闁跨噦鎷�
闂佺ǹ绻堥崝宥夊蓟閻斿憡濯寸€广儱鎷嬮崝鍛槈閺冨倸孝闁汇劎濮甸敍鎰板箣濠婂懐鎳囨繛鎴炴尰濮樸劑鎮¢敍鍕珰闁糕槅鍘剧粈澶愭煙缂佹ê濮囩€规洖鐭傞幆宥夊棘閸喚宀涢悗瑙勬偠閸庢壆绱為弮鍫熷殑闁芥ê顦~鏃堟煥濞戞ǹ瀚板┑顕呬邯楠炲啴濡搁妷锕€娓愰梻渚囧亞閸犳劙宕瑰鑸碘拹濠㈣埖鐡曠粈瀣归崗鍧氱細妞ゎ偄鎳橀幆鍐礋椤愩倖顔忔俊顐ゅ閸ㄥ灚瀵奸幇顔剧煓閻庯綆浜為悷锟�...
- 婵炴垶鎼╅崢鐐殽閸モ晙鐒婇柛鏇ㄥ灱閺嗐儳鈧鎮堕崕鎶藉煝閼测晜鏆滈柛顐g箓閹鏌熺€涙ê濮囬柣鎾规硶閹峰顢橀悢鍛婄暚缂備礁顑呴鍛淬€冨⿰鍛晳闁跨噦鎷�
缂備緡鍣g粻鏍焵椤掑﹥瀚�30婵犮垼鍩栧畝绋课涢鍌欑剨闁告洦鍨奸弳銉╂煕閳哄喚鏀版い鏂垮閹风娀宕滆閺屻倝鏌ㄥ☉妯侯殭缂佹鎸鹃埀顒傤攰閸╂牕顔忕捄銊﹀珰闁规儳鎳愮粈澶愭煕閺傜儤娅呮い鎺斿枛瀹曘劌螣閻戞ê娓愰梻渚囧亞閸犳洟骞撻鍫濈濡鑳堕鍗炩槈閹垮啩绨婚柟顔奸叄瀵粙鎮℃惔锝嗩啅婵☆偆澧楅崹鍨閹邦喚鐭欓悗锝庝簽閻熷酣鏌i妸銉ヮ伂妞も晪绠戞晥闁跨噦鎷�...
- Agilent ADS 闂佽桨鐒﹂悷銉╊敆閻旂厧鏄ョ痪顓炴媼閸炴煡鎮归崶褍鈷旈柍璇插悑缁鸿棄螖閸曞灚顥�
婵炴垶鎸婚幐鎼侇敊瀹ュ绠抽柛顐秵閸わ箓鏌ㄥ☉妯垮闁告瑥绻樺Λ鍐閿濆骸鏁奸柣鐔哥懐閺嬪儊S闂佸憡鑹剧€氼噣锝為幒妤€绀夐柣鏃囶嚙閸樻挳鏌涘⿰鍐濞村吋鍔楃划娆戔偓锝庝簽鐎瑰鏌i姀鈺冨帨缂侀亶浜跺畷婵嬪煛閸屾矮鎲鹃梺鐑╁亾閸斿秴銆掗崼鏇熷剹妞ゆ挾濮甸悾閬嶆煛閸愩劎鍩f俊顐ユ硶閳ь剚鍐荤紓姘辨閻у挷S...
- HFSS闁诲孩鍐荤紓姘卞姬閸曨垰鏄ョ痪顓炴媼閸炴煡鎮归崶褍鈷旈柍璇插悑缁鸿棄螖閸曞灚顥�
闁荤姍鍐仾缂佽鐒︾粙澶愬箻閹颁礁鏅欓梺鐟版惈閻楁劙顢氶幎鑺ユ櫖閻忕偠妫勫鍧楁⒒閸稑鐏辨い鏂款樀楠炴帡宕峰▎绂⊿闂佹眹鍔岀€氼剚鎱ㄥ☉銏″殑闁芥ê顦扮€氭煡骞栫€涙ɑ鈷掗柡浣靛€濋弫宥囦沪閽樺鐩庨梺鍛婃煛閺呮粓宕戝澶婄闁靛ň鏅滃銊х磼椤栨繂鍚圭紒顔芥そ瀹曠兘寮跺▎鎯уΤ婵炴垶姊绘慨鐢垫暜婢舵劕绠垫い鈥抽敪SS...
- CST閻庣敻鍋婇崰妤冧焊濠靛棭鍟呴柕澶堝€楃粙濠囨倵楠炲灝鈧洟鎮$捄銊﹀妞ゆ挾鍠愬▓宀€绱掔€n亶鍎忔い銊︾矌閹叉鏁撻敓锟�
闂佸搫顦€涒晛危閹存緷铏光偓锝傛櫅閻︽粓鎮规担绛嬪殝缂佽鲸绻堝畷妤呭Ω閳哄倹銆冮柣鐘辩瀵泛顔忕欢缍璗闂佸憡鑹剧€氫即濡村澶婄闁绘棁顕ч崢鎾煕濠婂啳瀚板ù鍏煎姉缁瑧鈧綆浜炵€瑰鏌i姀鈺冨帨缂佽鲸绻堝畷婵嬪煛閸屾矮鎲鹃棅顐㈡祩閸嬪﹪鍩€椤掑倸鏋欓柛銈嗙矌閳ь剚鍐婚梽鍕暜婢舵劕绠垫い鈥愁敍T闁荤姳鐒﹀畷姗€顢橀崨濠冨劅闁哄啫鍊归弳锟�...
- 闁诲繐绻愮€氫即銆傞崼鏇炴槬闁惧繗顕栭弨銊╂煕閳哄喚鏀版い鏂垮閹风娀宕滆閺岋拷
婵炴垶鎸稿ú锝囩箔閳ь剙螖閸屾惮鎴﹀Χ婵傚摜宓侀柛鎰级閸曢箖鎮硅閸ゆ牜妲愬┑鍥ㄤ氦婵炲棗娴烽弰鍌炴偣閸パ冣挃闁宠鍚嬬粙澶嬫姜閹殿喚鈽夐梺闈╄礋閸斿矂鎯冮悩绛圭矗闁瑰鍋涜灇闂佸搫鐗滈崹鍫曘€傞锕€鏄ラ柣鏃€鐏氭禍锝夋倶閻愬瓨绀冮悗姘辨暬閹虫ê顫濋崜褏顦梺鐟扮仛閹搁绮崨鏉戦敜婵﹩鍓涢弶浠嬫煟閵娿儱顏х紒妤佹尰缁嬪顫濋鍌氭暏缂佺虎鍘搁崑锟�...
- 閻庣敻鍋婇崰妤冧焊濠靛牅鐒婇柛鏇ㄥ灱閺嗐儲绻涢弶鎴剶闁革絾妞介獮娆忣吋閸曨厾鈻曢梺绯曟櫇椤㈠﹪顢欓崟顓熷珰闁告挆鈧弻銈夋煕濮橆剛澧︽繛澶涙嫹
闁荤姵鍔﹂崢娲箯闁秴瑙﹂柛顐犲劜閼茬娀鏌¢崶銊︾稇闁汇倕瀚伴獮鍡涙偑閸涱垳顦紓鍌氬暞閸ㄧ敻宕规惔銊ノュ〒姘e亾妞わ絽澧庨幏顐﹀矗濡搫纾块梺闈涙閼冲爼濡靛顑芥灃闁靛繒濮甸悵銈夋煏閸℃洘顦峰ǎ鍥э躬瀹曪綁鏌ㄧ€n剛鍩嶉梺鎸庣☉閺堫剟宕瑰⿰鍛暫濞达絽婀辨竟澶愭煛瀹ュ妫戠紒銊ユ健閺屽懘鏁撻敓锟�...