亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? os51asm.asm

?? 在8052上移植成功的uc/os源碼。注意:使用Compass 51編譯器!
?? ASM
字號:
;********************************************************************************************************
;                                                 uC/OS
;                                          The Real-Time Kernel
;
;                                   52 SPECIFIC ASSEMBLY LANGUAGE CODE
;
;                                             Rene Voorberg
;                                           80c52 (Large Model)
;				   Using the COMPASS51 compiler from PLC  Texas USA
;
; File : OS51asm.asm
;********************************************************************************************************
;Conventions:
;opt 	:optimized code but is shows you what's happening
;P3.5	:break bit which is used by the Intel Rism Drivers or ROM monitors from 
;PLC to signal a breakpoint. If we are stepping or a breakpoint is hit
;no interrupts should be honoured no more beside the serial interrupt for 
;your debugger.
;_sp	:the (integer) xstackpointer used by the Compass 51 compiler
;_fp	:the (integer) framepointer used by the Compass 51 compiler
;OSTCBCur:
;	Pointer to the current's process OSTCB
;OSTCBHighRdy:
;	Pointer to the process OSTCB with the highest priority which is ready to run
	XDEF  	_OSStartHighRdy
	XDEF  	_OSCtxSw
	XDEF  	_OSIntCtxSw
	XDEF	_OSTickIsr
;I forced OSTCBHighRdy to be near in ucos51.c
	XREF  	_OSTCBHighRdy
;I forced OSTCBCur to be near in ucos51.c
	XREF  	_OSTCBCur
	XREF  	_OSIntExit
	XREF  	_OSIntEnter
	XREF	_OSTimeTick
	XREF	_tick
	XREF	__fp:DATA
	XREF	__sp:DATA
;Extra divisor for slow tick rates
	XREF	_OSTick:DATA
;I forced OSIntNesting to be near in ucos51.c
	XREF	_OSIntNesting:DATA
	XREF	_OSTCBCur:DATA
	XREF	_OSTCBHighRdy:DATA
	XDEF	_RestoreState
;To have the two task pointers run fast we store them near
;The code can also be used with far OSTCBCur and HighRdy 
;then you must remove the next define.
near	EQU	1
;include the appropriate files
INCLUDE "80C320.INC"

;MCS51_CRYSTAL_FREQ   equ 18432000
;OS_TICKS_PER_SEC     equ 20 possible with 80c320 or 80c151
MCS51_CRYSTAL_FREQ   equ 11059200
OS_TICKS_PER_SEC     equ 10

;Determine the reload values for timer 1 this is automated by the next macro
TIMER0RELOAD equ (MCS51_CRYSTAL_FREQ / (OS_TICKS_PER_SEC * 12))
T0RELOADM equ (TIMER0RELOAD>>16)+1	; +1 decause of the djnz instruction which should at least run once 
T0RELOADH equ (65536-(TIMER0RELOAD&65535))>>8
T0RELOADL equ (65536-(TIMER0RELOAD&65535))&255

;Install the interrupt vector for your timer tick in your main program
;In compass we can do it here like:
;    	LVECTOR	00Bh , _OSTickIsr 
	
;The following macro is the assembly code to save the current task's state
;SEGMENT c_text
save_context:	MACRO
	PUSH	PSW
	PUSH	ACC
	PUSH	B
	PUSH	0
	PUSH	1
	PUSH	2
	PUSH	3
	PUSH	4
	PUSH	5
	PUSH	6
	PUSH	7
	PUSH	DPH
	PUSH	DPL
	PUSH	__fp			;save the framepointer (Compass 51)
	PUSH	__fp+1
	PUSH	__sp			;save the stackpointer
	PUSH	__sp+1
	CLR	EA
	;copy internal stack to external
	CLR	C
	MOV	A,SP
	;We intialized every tasks internal stackpointer to 80h
	;in order to determine howe far(near) it has grown we need 
	;to substract 7Fh from the stackpointer
	SUBB	A,#7Fh
	MOV	R1,A		;istacklength in R1
	MOV	R5,A		;also save to move it on top of xstack
	MOV	R0,#80h		;Start address of istack pointer 
	MOV	DPH,__sp	;Get the xstack pointer
	MOV	DPL,__sp+1
	INC	DPTR		;point to the next free location because
				;the xstack pointer points to the last pushed value
$$save_ctx:			;Copy the istack to xstack  
				;(the $$ in the macro is for repetitive macro call labels)
				;compiler generates $1save_ctx first time round and $2 2nd time
	MOV	A,@R0		;Get the byte from the istack
	MOVX	@DPTR,A		;move it into xstack
	INC	DPTR		;advance
	INC	R0		;advance
	DJNZ	R1,$$save_ctx	;Copy the whole internal stack into external stack
	;and adjust _sp
	MOV	A,R5		;Save the istack length onto the xstack
	MOVX	@DPTR,a		;
	INC	DPTR		;__sp should point to the next free byte
	MOV	__sp,DPH	;Save the new stack pointer to __sp
	MOV	__sp+1,DPL
	MOV	SP,#80h		;Start the new task with SP set to #80h
ENDMAC	save_context

restore_context: MACRO	interrupt
	CLR	EA
IFMA 1
;execute this macro with 1 if we have 
;__sp already filled with the appropriate xstack location
;seems difficult but for speedreasons it saves some states.
; this is used in for example an interrupt
;We need to copy __sp in dptr
;	DPTR=_SP
	MOV	DPH,__sp
	MOV	A,__sp+1
ELSE
;enter this macro with dptr loaded with OSTCBCur:
;the new task. We need to copy OSTCBCur->StkPtr in dptr
;	DPTR=_SP=@DPTR 
	MOVX	A,@DPTR
	MOV	R3,A
	INC	DPTR
	MOVX	A,@DPTR
;opt	MOV	DPL,A
	MOV	DPH,R3			;dptr now points to the last free location
ENDIF
;	DPTR-=1
	CLR	C
;opt	MOV	A,DPL
	SUBB	A,#1h			;decrement dptr because it is pointing to the next free xstack position
	MOV	DPL,A
	JNC	$$rest_ctx2
	DEC	DPH			;DPTR now points to the end of the tasks stack
$$rest_ctx2: 
;	A=@DPTR
	MOVX	A,@DPTR			;first byte is number of bytes on external stack
;	DEC	A			;correct that we have read the nr of stacked values
	MOV	R5,A
	CLR	C
	MOV	A,DPL
	SUBB	A,R5			;substract it from the DPTR
	MOV	DPL,A
	JNC	$$rest_ctx3
	DEC	DPH			;DPTR now points to the base of the tasks stack
$$rest_ctx3:
	MOV	R0,#80H			;Every task has its internal stack at IRAM
	MOV	1,5			;Copy nr of bytes on stack in r1
$$rest_ctx4:
	MOVX	A,@DPTR
	MOV	@R0,A
	INC	DPTR
	INC	R0
       	DJNZ	R1,$$rest_ctx4		;Copy the whole stack back into internal stack
	MOV	A,R5			;Copy nr of bytes on stack in A
	ADD	A,#7Fh			;Add 127 for offset for stackpointer not 128 
					;because SP points to a byte that contains data 
					;so 1 byte on stack should be in 80h
	MOV	SP,A			;Restore the stackpointer
	SETB	EA
	LJMP    _RestoreState
ENDMAC	restore_context

;i use this 'function' to return form every interrupt or ctx switch
;it saves space. Interrupts can not enter by a shared routine because the 
;stack can't be fixed to jump to the particular interrupt handler
_RestoreState:
	POP	__sp+1			;Start restoring the context
	POP	__sp			
	POP	__fp+1			
	POP	__fp			
	POP	DPL
	POP	DPH
	POP	7
	POP	6
	POP	5
	POP	4
	POP	3
	POP	2
	POP	1
	POP	0
	POP	B
	POP	ACC
	POP	PSW
	RETI
;*********************************************************************************************************
;                                      START MULTITASKING
;                                   void OSStartHighRdy(void)
;
; Total execution time :  xxbus cycles
;*********************************************************************************************************
_OSStartHighRdy:
	CLR	EA
IFDEF near
;	_OSTCBCur=_OSTCBHighRdy
	MOV	_OSTCBCur,_OSTCBHighRdy
	MOV	_OSTCBCur+1,_OSTCBHighRdy+1
	MOV	DPL,_OSTCBCur+1		;dptr point TO OSTCBCur->STCKPTR 
	MOV	DPH,_OSTCBCur
ELSE
        MOV	DPTR,#(_OSTCBHighRdy)	;R6:R7  = OSTCBHighRdy
	MOVX	A,@DPTR
	MOV	R6,A
	INC	DPTR
	MOVX	A,@DPTR
	MOV	R7,A
	MOV	DPTR,#(_OSTCBCur)	;OSTCBCur = OSTCBHighRdy
	MOV	A,R6
	MOVX	@DPTR,A
	INC	DPTR
	MOV	A,R7
	MOVX	@DPTR,A
	MOV	DPL,R7			;point TO OSTCBCUR->STCKPTR 
	MOV	DPH,R6
ENDIF
	restore_context

;*********************************************************************************************************
;                                PERFORM A CONTEXT SWITCH (From task level)
;                                           void OSCtxSw(void)
;
; Total execution time : xx bus cycles
;*********************************************************************************************************
_OSCtxSw:
	save_context
IFDEF near
;	DPTR=OSTCBCur
	MOV	DPH,_OSTCBCur		;dptr point TO OSTCBCur->STCKPTR 
	MOV	DPL,_OSTCBCur+1
ELSE
;	DPTR=OSTCBCur
        MOV	DPTR,#(_OSTCBCur)	;R6:R7  = OSTCBCur
;	WR6=@DPTR
	MOVX	A,@DPTR
	MOV	R6,A
	INC	DPTR
	MOVX	A,@DPTR
;opt	MOV	R7,A
;	DPTR=WR6
;opt	MOV	DPL,R7			;point TO OSTCNCUR->STCKPTR 
	MOV	DPL,A			;point TO OSTCNCUR->STCKPTR 
	MOV	DPH,R6
ENDIF
;	@DPTR=_SP
	MOV	A,__sp
	MOVX	@DPTR,A
	INC	DPTR
	MOV	A,__sp+1
	MOVX	@DPTR,A
IFDEF near
;	OSTCBCur=OSTCBHighRdy
	MOV	_OSTCBCur,_OSTCBHighRdy
	MOV	_OSTCBCur+1,_OSTCBHighRdy+1
	MOV	DPL,_OSTCBCur+1		;dptr point TO OSTCBCur->STCKPTR 
	MOV	DPH,_OSTCBCur
ELSE
;	DPTR=OSTCBHighRdy
        MOV	DPTR,#(_OSTCBHighRdy)	;get OSTCBHighRdy
;	WR4=@DPTR
	MOVX	A,@DPTR
	MOV	R4,A
	INC	DPTR
	MOVX	A,@DPTR
	MOV	R5,A
;	DPTR=OSTCBCur
        MOV	DPTR,#(_OSTCBCur)	;get OSTCBCur
;	@DPTR=WR4
	MOV	A,R4
	MOVX	@DPTR,A
	INC	DPTR
	MOV	A,R5
	MOVX	@DPTR,A
;	DPTR=WR4
	MOV	DPL,R5			;point TO OSTCNHighRdy->STCKPTR 
	MOV	DPH,R4
ENDIF
	restore_context

_OSIntCtxSw:			;First repair the stackpointer for two calls
	CLR	EA		;Do not interrupt during this sequence
	CLR	C		;copy internal stack to external
	MOV	A,SP
	ADD	A,#-4		;correct 4 bytes on stack for two calls (four bytes)
	MOV	SP,A		;Save the stackpointer
				;On the stack the first two bytes are _sp
				;we need to refresh it because it might have been corrupted
				;in the interrupt routine
				;We pop the _sp into DP because we need it to copy the 
				;internal stack to
	POP	DPL		;
	POP	DPH		;Get the external stack pointer
	PUSH	DPH		;Save it again to keep the stack intact
	PUSH	DPL		;
;	POP	__sp+1		;Optimised
;	POP	__sp		;Start testoring the context
;	PUSH	__sp		;
;	PUSH	__sp+1		;
				;Now copy the internal stack to the external stack
;	CLR	EA		;Do not interrupt during this sequence
				;copy internal stack to external
	CLR	C
;	MOV	A,SP		;Get the stackpointer ;Optimised SP is already in ACC
	SUBB	A,#7Fh		;See how many bytes are on stack
	MOV	R1,A		;Save in R1
	MOV	R5,A		;Save to move on top of xstack
	MOV	R0,#80h		;Bottom of internal stack
;Optimised ;The next section if performed by the POP and PUSH of DP in the previous lines
;	MOV	DPH,__sp	;Get the external stack pointer
;	MOV	DPL,__sp+1
	INC	DPTR		;Point to the next free location
$$save_ctx:
	MOV	A,@R0
	MOVX	@DPTR,A
	INC	DPTR
	INC	R0
	DJNZ	R1,$$save_ctx	;Copy the whole internal stack into external stack
	;and adjust _sp
	MOV	A,R5
	MOVX	@DPTR,a
;	__sp should point to the next free byte
	INC	DPTR
	MOV	__sp,DPH
	MOV	__sp+1,DPL
; Optimised 	MOV	SP,#80h
IFDEF near
;	DPTR=OSTCBCur
	MOV	DPH,_OSTCBCur		;dptr point TO OSTCBCur->STCKPTR 
	MOV	DPL,_OSTCBCur+1
ELSE
;	DPTR=OSTCBCur
        MOV	DPTR,#(_OSTCBCur)	; 4~, R6:R7  = OSTCBCur
;	WR6=@DPTR
	MOVX	A,@DPTR
	MOV	R6,A
	INC	DPTR
	MOVX	A,@DPTR
;opt	MOV	R7,A
;	DPTR=WR6
;opt	MOV	DPL,R7			;point TO OSTCNCUR->STCKPTR 
	MOV	DPL,A			;point TO OSTCNCUR->STCKPTR 
	MOV	DPH,R6
ENDIF
;	@DPTR=_SP
	MOV	A,__sp
	MOVX	@DPTR,A
	INC	DPTR
	MOV	A,__sp+1
	MOVX	@DPTR,A
IFDEF near
;	OSTCBCur=OSTCBHighRdy
	MOV	_OSTCBCur,_OSTCBHighRdy
	MOV	_OSTCBCur+1,_OSTCBHighRdy+1
	MOV	DPL,_OSTCBCur+1		;dptr point TO OSTCBCur->STCKPTR 
	MOV	DPH,_OSTCBCur
ELSE
;	DPTR=OSTCBHighRdy
        MOV	DPTR,#(_OSTCBHighRdy)	; 4~, R6:R7  = OSTCBHighRdy
;	WR4=@DPTR
	MOVX	A,@DPTR
	MOV	R4,A
	INC	DPTR
	MOVX	A,@DPTR
	MOV	R5,A
;	DPTR=OSTCBCur
        MOV	DPTR,#(_OSTCBCur)	; 4~, R6:R7  = OSTCBCur
;	@DPTR=WR4
	MOV	A,R4
	MOVX	@DPTR,A
	INC	DPTR
	MOV	A,R5
	MOVX	@DPTR,A
;	DPTR=WR4
	MOV	DPL,R5			;point TO OSTCBHighRdy->STCKPTR 
	MOV	DPH,R4
ENDIF
	restore_context			;Fix the stack nd return

_OSTickIsr:
        JNB     P3.5,OSTick2		;if break flag set
OSTick1:
	RETI
OSTick2:
	DJNZ	_OSTick,OSTick1
	MOV	_OSTick,#T0RELOADM	;hsb value from macro
	MOV	TL0,#T0RELOADL          ;lsb value set by user
	MOV	TH0,#T0RELOADH 		;m(id)sb value set by user
OSTick3:
	CPL	P1.7			;toggle bit for scope or something
	PUSH	PSW
	PUSH	ACC
	PUSH	B
	PUSH	0
	PUSH	1
	PUSH	2
	PUSH	3
	PUSH	4
	PUSH	5
	PUSH	6
	PUSH	7
	PUSH	DPH
	PUSH	DPL
	PUSH	__fp
	PUSH	__fp+1
	PUSH	__sp
	PUSH	__sp+1
;       LCALL	_OSIntEnter
	INC	_OSIntNesting		;Read modify write increment of OSIntNesting
;	SETB	EA
       	LCALL	_OSTimeTick
;The next instruction shoul only be performed if you get it out of the
;ucos code. Remove OSIntNesting--; from OSIntExit
;This way is faster than the code generated by any compiler
	DEC	_OSIntNesting		;Read modify write increment of OSIntNesting
       	LCALL	_OSIntExit		;Note ! increment of OSIntNesting removed from the UCOS code
	LJMP	_RestoreState		;Use the shared code to exit the interrupt handler


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区大片| 久久99在线观看| 欧美在线看片a免费观看| 夜夜操天天操亚洲| 在线观看91精品国产麻豆| 首页国产丝袜综合| 精品少妇一区二区三区日产乱码 | 欧美在线观看视频一区二区三区 | 亚洲电影在线播放| 91.xcao| 久久精品免费看| 久久这里只有精品6| 国产99久久久久久免费看农村| 中文字幕一区二区在线观看| 色婷婷综合久久| 男女男精品网站| 久久五月婷婷丁香社区| 丁香婷婷综合五月| 亚洲一区二区欧美| 久久综合色一综合色88| 91免费精品国自产拍在线不卡| 一区二区在线免费观看| 欧美成人一区二区三区在线观看| 国产精品18久久久久久久网站| 日韩毛片一二三区| 日韩午夜在线影院| 波波电影院一区二区三区| 青青草原综合久久大伊人精品| 国产亚洲成aⅴ人片在线观看| 91蝌蚪porny| 免费成人在线网站| 亚洲欧美综合另类在线卡通| 91麻豆精品国产91久久久久久| 国产成人免费视频一区| 香蕉成人伊视频在线观看| 国产调教视频一区| 91.com在线观看| 99久久婷婷国产综合精品| 蜜臀久久久久久久| 国产精品初高中害羞小美女文| 欧美日本一道本| av一二三不卡影片| 精品一区二区三区免费观看| 亚洲一区二区视频在线| 国产视频一区二区在线观看| 欧美妇女性影城| 色哟哟亚洲精品| 国产不卡免费视频| 理论电影国产精品| 亚洲国产一区二区在线播放| 国产精品成人午夜| 久久青草欧美一区二区三区| 欧美久久久久免费| 色噜噜狠狠色综合中国| 国产成人综合在线播放| 另类专区欧美蜜桃臀第一页| 亚洲精品国产品国语在线app| 久久伊人中文字幕| 日韩精品自拍偷拍| 555www色欧美视频| 国产成人精品免费| 激情久久五月天| 久色婷婷小香蕉久久| 蜜臀久久久99精品久久久久久| 亚洲成av人片一区二区| 亚洲一区二区五区| 亚洲影院免费观看| 一区二区欧美视频| 一区二区三区四区不卡在线| 自拍偷拍国产亚洲| 亚洲免费观看在线观看| 亚洲日本在线视频观看| 成人欧美一区二区三区1314| 中文字幕不卡一区| 国产日韩欧美不卡在线| 国产午夜精品一区二区三区视频| 久久无码av三级| 久久精品一区二区三区不卡| 久久―日本道色综合久久| 久久久久久久综合日本| 亚洲国产精品国自产拍av| 久久久精品中文字幕麻豆发布| 国产无遮挡一区二区三区毛片日本| 久久久久久亚洲综合| 国产欧美日韩麻豆91| 国产精品麻豆网站| 一区二区三区四区国产精品| 亚洲国产cao| 免费在线观看一区| 九九热在线视频观看这里只有精品| 精品亚洲porn| 国产一区三区三区| 成人h动漫精品一区二| 91免费在线播放| 欧美军同video69gay| 欧美福利视频一区| 久久久亚洲午夜电影| 亚洲裸体在线观看| 天堂在线一区二区| 狠狠色丁香久久婷婷综| 99久久精品免费看| 欧美日韩国产综合久久| 欧美大肚乱孕交hd孕妇| 国产精品亲子乱子伦xxxx裸| 亚洲最新视频在线观看| 美女视频第一区二区三区免费观看网站| 极品少妇一区二区| 99精品久久免费看蜜臀剧情介绍| 欧美这里有精品| 久久久91精品国产一区二区三区| 亚洲人成伊人成综合网小说| 视频一区二区欧美| 丁香激情综合国产| 欧美日韩精品欧美日韩精品| 久久综合色鬼综合色| 亚洲欧美区自拍先锋| 蜜臀久久99精品久久久久久9| 成人黄色a**站在线观看| 56国语精品自产拍在线观看| 国产精品丝袜91| 日韩av中文在线观看| 一本一本久久a久久精品综合麻豆| 91精品国产综合久久精品app| 国产精品久久久久影院老司| 亚洲丶国产丶欧美一区二区三区| 国产精品一区二区在线播放| 欧美日韩一区高清| 国产精品护士白丝一区av| 久久国产精品99精品国产| 欧日韩精品视频| 中文一区二区在线观看| 免费看日韩a级影片| 色婷婷综合五月| 欧美激情一区二区三区在线| 日韩福利电影在线观看| 色94色欧美sute亚洲线路一ni| 久久色成人在线| 肉色丝袜一区二区| 欧美性色aⅴ视频一区日韩精品| 国产欧美一区二区精品性色超碰| 奇米色777欧美一区二区| 欧美视频一区在线观看| 亚洲天堂2014| 成人av集中营| 久久久久久日产精品| 久久精品国产久精国产爱| 欧美性受xxxx黑人xyx性爽| ㊣最新国产の精品bt伙计久久| 韩国欧美国产一区| 5566中文字幕一区二区电影| 亚洲尤物在线视频观看| 色噜噜久久综合| 亚洲免费在线观看视频| 91日韩在线专区| 亚洲私人黄色宅男| 91农村精品一区二区在线| 国产精品久久久久久久裸模| 成人激情小说网站| 国产亲近乱来精品视频| 国产精品影视天天线| 精品国产一区久久| 精品一区二区在线观看| 日韩欧美色综合网站| 麻豆精品国产91久久久久久| 在线播放亚洲一区| 日本不卡高清视频| 日韩女优毛片在线| 久88久久88久久久| 久久老女人爱爱| 福利一区二区在线观看| 久久精品亚洲乱码伦伦中文 | 欧美日韩中文字幕一区二区| 亚洲另类在线视频| 色噜噜狠狠一区二区三区果冻| 一级日本不卡的影视| 日本道精品一区二区三区 | 午夜精品久久久久久久久| 欧美顶级少妇做爰| 久久精品二区亚洲w码| 精品免费视频一区二区| 国产一区二区精品久久91| 国产女人aaa级久久久级| 成人黄色一级视频| 亚洲一区二区三区四区中文字幕 | 日本成人在线看| 精品久久久久久久久久久院品网 | 99re成人精品视频| 一区二区三区在线免费观看| 在线视频一区二区免费| 亚洲成人精品一区| 欧美成人一级视频| 波多野结衣在线一区| 一区二区三区国产豹纹内裤在线 | 国产精品一卡二卡在线观看| 国产精品免费观看视频| 欧美色视频在线| 国产一区二区三区四区五区入口| 欧美国产日本韩| 欧美中文字幕一区| 国产一区二区不卡|