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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? driv_internal_uart_asm.s

?? UCOS-II2.76在ADI-BF533上的移植.在UCOS-II網站提供的源碼基礎上修改了幾處匯編代碼.采用2.76版系統內核移植,在DSP++4.0上調試成功
?? S
字號:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*										  Driver functions for
*										  ADSP-BF533 Internal Uart
*
* File : Driv_Internal_UART_Asm.s
* By   : Ron Territo   ron@territocomputerservices.com
*********************************************************************************************************

Copyright...

This code is placed in the public domain, and can be distributed freely with no restrictions provided that the heading
of each source module file is not modified to remove the credit to the original author.
  
Disclaimer...

This program code is provided "as is". There is no warranty, either expressed or implied as to its fitness for use in
any application. It is provided only as an example of porting the MicroC/OS operating system to the Blackfin processor.
Its use is strictly at the risk of the user. The author will not be liable for any damages direct or consequential related
to the use of this software including, but not limited to loss of profit.

*/



#include <cdefBF533.h>
#include "uCOS-II_V2.70\os_cfg.h";

.import "uCOS-II_V2.70\source\ucos_ii.h";


#define TX_BUFFER_SIZE 1024
#define RX_BUFFER_SIZE 1024


/*
*****************************************************************************
*
*	External functions &  variables
*
*****************************************************************************
*/

.extern _CpuRegisterEventHandler;
.extern _CpuIrqOff;
.extern _CpuIrqOn;
.extern _CpuEnableEvent;
.extern _CpuEnableInterrupt;
.extern _CpuSaveContext;
.extern _CpuRestoreContext;

.extern struct OS_TCB _OSTCBCur;
.extern _OSIntExit;
.extern _OSIntNesting;
.extern _OSRunning;
.extern _OSFlagCreate;
.extern _OSFlagPost;


/*
*********************************************************************************************************
*
*	Global Data
*
*********************************************************************************************************
*/


.section data1;

.global _EvUARTFlags;
.var _EvUARTFlags;

.var __OSErr;

.global _RxIntBufferEptr;
.var _RxIntBufferEptr;
.global _RxIntBufferFptr;
.var _RxIntBufferFptr;
.global _RxIntBufferTptr;
.var _RxIntBufferTptr;
.global _RxIntBuffer;
.byte _RxIntBuffer[RX_BUFFER_SIZE];

.global _TxIntBufferEptr;
.var _TxIntBufferEptr;
.global _TxIntBufferFptr;
.var _TxIntBufferFptr;
.global _TxIntBufferTptr;
.var _TxIntBufferTptr;
.global _TxIntBuffer;
.byte _TxIntBuffer[TX_BUFFER_SIZE];

.section program;


/*
*********************************************************************************************************
*
*               Internal UART Initialization
*
* Description: 	This function is called to initialize the Internal UART 
*
*
* Arguments  : 	Baud Rate,,,,  R0
*				Config'n.....  R1 
*
*				see defines for Baud and config in "Internal_UART.h"
*
*********************************************************************************************************
*/

.global _InternalUARTInit;

_InternalUARTInit:

	link 12;
	[ --sp ] = rets;					// save return address
	

	/* Load the Line Control Register */

	p1.H = ( UART_LCR >>16) & 0xFFFF;
	p1.L = ( UART_LCR & 0xFFFF );
	r2 = 0x80;							// set DL access in LCR	
	W [ p1 ] = r2;

	/* Load the divisor Register */
		
	p1.H = ( UART_DLL >>16) & 0xFFFF;	// set DL  high and low bytes
	p1.L = ( UART_DLL & 0xFFFF );
	r3 = 0xFF;
	r2 = r0 & r3;
	W [ p1 ] = r2;
	p1.H = ( UART_DLH >>16) & 0xFFFF;
	p1.L = ( UART_DLH & 0xFFFF );
	r0 >>= 8;
	r2 = r0 & r3;
	W [ p1 ] = r2;
	
	/* Enable the UART Clock */
	
	p1.H = ( UART_GCTL >>16) & 0xFFFF;	
	p1.L = ( UART_GCTL & 0xFFFF );
	r2 = 0x01;							// Enable clock ( no IrDA )
	W [ p1 ] = r2;

		
	/* Load the Line Control Register */

	p1.H = ( UART_LCR >>16) & 0xFFFF;
	p1.L = ( UART_LCR & 0xFFFF );
	r3 = 0x7F;
	r2 = r1 & r3;						// set config and not DL access	
	W [ p1 ] = r2;
	
	/* Load UART Interrupt Enable Register */
	
	p1.H = ( UART_IER >>16) & 0xFFFF;
	p1.L = ( UART_IER & 0xFFFF );
	r2 = 0x1;							// enable Rx only int
	W [ p1 ] = r2;

	
	/* Set exception vector */
			
	r0 = 10;							// Interrupt Event 10 = UART Rx Tx
	r1.H = _InternalUARTInt;
	r1.L = _InternalUARTInt;
	call _CpuRegisterEventHandler;
	
	/* Create a uC/OS Event Falg group for UART */
	
	r0 = 0; 							// Initial Flag value
	r1.H = __OSErr;						// address of error variable
	r1.L = __OSErr;
	call _OSFlagCreate;					// Call OS to create flag
	p1.H = _EvUARTFlags;
	p1.L = _EvUARTFlags;
	[ p1 ] = r0;						// store return value ( is FlagGroup address )
	p1.H = __OSErr;						// address of error
	p1.L = __OSErr;
	r0 = B [ p1 ] (Z);					// get error value
	cc = r0 == 0;
	if !cc jump _InternalUARTInitx;		// error

	/* Setup buffer pointers */
	
	r0.H = _RxIntBuffer;
	r0.L = _RxIntBuffer;
	p1.H = _RxIntBufferFptr;
	p1.L = _RxIntBufferFptr;
	[ p1 ] = r0;
	p1.H = _RxIntBufferEptr;
	p1.L = _RxIntBufferEptr;
	[ p1 ] = r0;
	r1 = RX_BUFFER_SIZE-1;
	r0 = r0 + r1;
	p1.H = _RxIntBufferTptr;
	p1.L = _RxIntBufferTptr;
	[ p1 ] = r0;

	r0.H = _TxIntBuffer;
	r0.L = _TxIntBuffer;
	p1.H = _TxIntBufferFptr;
	p1.L = _TxIntBufferFptr;
	[ p1 ] = r0;
	p1.H = _TxIntBufferEptr;
	p1.L = _TxIntBufferEptr;
	[ p1 ] = r0;
	r1 = TX_BUFFER_SIZE-1;
	r0 = r0 + r1;
	p1.H = _TxIntBufferTptr;
	p1.L = _TxIntBufferTptr;
	[ p1 ] = r0;
	
	
	/* Enable exception event */
	
	r0 = 0x400;							// Interrupt Mask 0x400 = UART Rx & Tx
	call _CpuEnableEvent;
	
	/* Enable peripheral interrupt */
	
	r0 = 0x3;							// Peripheral Interrupt mask for UART Rx & Tx
	r0 <<=14;
	call _CpuEnableInterrupt;

	r0 = 0;								// no error
	
_InternalUARTInitx:
	rets = [ sp++ ];					// Restore return address & exit	
	unlink;	
	rts;		
_InternalUARTInit.end:


/*
****************************************
*
*	Internal UART Interrupt Handler
* 		for uC/OS-II
*
****************************************
*/	

_InternalUARTInt:

/////////////////
// ISR Preamble
////////////////

	[ --sp ] = r0;
	[ --sp ] = r1;
	[ --sp ] = p1;
	cli r0;								// stop all ints & save mask
	[ --sp ] = r0;
		
	[ --sp ] = reti;					// save sys regs				
	[ --sp ] = astat;
					
		
//////////////////
// ISR Processing
//////////////////

__InternalUARTIntL:
//	p1.H = ( UART_IIR >>16) & 0xFFFF;
//	p1.L = ( UART_IIR & 0xFFFF );
//	r0 = W [ p1 ] (Z);					// read the Interrupt Identification Reg
	
//	cc = r0 < 0x02 (IU);				// no int				
//	if cc jump __InternalUARTIntE;

//	cc = r0 < 0x04 (IU);				// test Tx empty				
//	if cc jump __InternalUARTIntTx;
	
//	cc = r0 < 0x06 (IU);				// test Rx avail				
//	if cc jump __InternalUARTIntRx;
	
//	jump __InternalUARTIntErr;			// must be Err


	p1.H = ( UART_LSR >>16) & 0xFFFF;
	p1.L = ( UART_LSR & 0xFFFF );
	r0 = W [ p1 ] (Z);
	
	cc = bittst( r0,0 );
	if cc jump __InternalUARTIntRx;

	cc = bittst( r0,5 );
	if !cc 	jump __InternalUARTIntE;
	
	p1.H = ( UART_IER >>16 ) & 0xFFFF;
	p1.L = ( UART_IER & 0xFFFF );
	r0 = W [ p1 ] (Z);
	cc = bittst( r0,1 );
	if cc jump __InternalUARTIntTx;
	
	jump __InternalUARTIntE;
	
//----------------------------	
// Receive Character Available
//----------------------------
	
__InternalUARTIntRx:
	[ --sp ] = fp;						// save more sys registers
	[ --sp ] = rets;
	
	call _CpuSaveContext;				// save all register context

	p1.H = _RxIntBufferFptr;			// get "fill" pointer for Rx Buffer
	p1.L = _RxIntBufferFptr;
	p0 = [ p1 ];
	
	p2.H = ( UART_RBR >>16) & 0xFFFF;	// get the next character from UART
	p2.L = ( UART_RBR & 0xFFFF );
	r3 = W [ p2 ] (Z);

	r1 = 1;								// flag = Char Received
	
	r0 = p0;							// Rx Buffer "fill" pointer
	p2.H = _RxIntBufferTptr;			// Rx Buffer "top" pointer
	p2.L = _RxIntBufferTptr;
	r2 = [ p2 ];

	cc = r2 < r0;						// did we overflow RxBuffer ?
	if !cc jump __InternalUARTIntRx1;
	
	r2 = 0x02;
	r1 = r1 | r2;						// set Rx Overflow event flag
	
//	p1.H = ( UART_IER >>16) & 0xFFFF;	// stop any more ints
//	p1.L = ( UART_IER & 0xFFFF );
//	r0 =  W [ p1 ] (Z);
//	r2 = ~0x1;
//	r0 = r0 & r2;
//	W [ p1 ] = r0;

	jump	__InternalUARTIntRx2;

__InternalUARTIntRx1:

	B [ p0 ] = r3;						// store char in Rx Buffer
	r0 += 1;							// bump fill pointer
	[ p1 ] = r0;
	
	
__InternalUARTIntRx2:
	p1.H = _OSIntNesting;				// bump OS Int Nesting level
	p1.L = _OSIntNesting;
	r0 = [ p1 ];
	r0 += 1;				
	[ p1 ] = r0;
	
	link 0;
	p1.H = _EvUARTFlags;				// signal EvUARTFlag that Rx data is avail
	p1.L = _EvUARTFlags;
	r0 = [ p1 ];
	r2 = 1;								// option = OS_FLAG_SET
	r3.H = __OSErr;						// address of error var
	r3.L = __OSErr;
	[ --sp ] = r3;						// save args on stack
	[ --sp ] = r2;
	[ --sp ] = r1;						
	[ --sp ] = r0;						
	call _OSFlagPost;					// OSFlagPost();
	unlink;

	p1.H = _OSIntNesting;				// grind OS Int Nesting level
	p1.L = _OSIntNesting;
	r0 = [ p1 ];
	r0 += -1;				
	[ p1 ] = r0;

	call _CpuRestoreContext;			// restore register context
	rets = [ sp++ ];					// restore sys regs
	fp = [ sp++ ];
	
//	jump __InternalUARTIntE;
	jump __InternalUARTIntL;

	
//----------------------------	
// Transmit Buffer Empty
//----------------------------
	
__InternalUARTIntTx:
	[ --sp ] = fp;						// save more sys registers
	[ --sp ] = rets;
	
	call _CpuSaveContext;				// save all register context

	p0.H = _TxIntBufferFptr;			// get filling & emptying pointers
	p0.L = _TxIntBufferFptr;
	r0 = [ p0 ];
	p1.H = _TxIntBufferEptr;
	p1.L = _TxIntBufferEptr;
	r1 = [ p1 ];
	
	cc = r0 == r1;						// are we drained ?
	if !cc jump __InternalUARTIntTx1;	// no... go send next char
	 
	r0.H = _TxIntBuffer;				// reset pointers to buffer head
	r0.L = _TxIntBuffer;
	[ p0 ] = r0;
	[ p1 ] = r0;
	
	p0.H = ( UART_IER >>16) & 0xFFFF;	// stop any more tx ints
	p0.L = ( UART_IER & 0xFFFF );
	r0 =  W [ p0 ] (Z);
	bitclr ( r0, 1);
	W [ p0 ] = r0;

	r1 = 4;								// ev flag = TX Empty
	jump __InternalUARTIntTxX;
	
	
__InternalUARTIntTx1:
	p0 = r1;							// emptying pointer
	r1 += 1;							// bump emptying pointer
	[ p1 ] = r1;
	r0 = B [ p0 ] (Z);					// get char there			
	p0.H = ( UART_THR >>16) & 0xFFFF;
	p0.L = ( UART_THR & 0xFFFF );
	W [ p0 ] = r0;						// put char in UART transmiter
	r1 = 8;								// evflag = TX Ready

__InternalUARTIntTxX:
	p1.H = _OSIntNesting;				// bump OS Int Nesting level
	p1.L = _OSIntNesting;
	r0 = [ p1 ];
	r0 += 1;				
	[ p1 ] = r0;
	
	link 0;
	p1.H = _EvUARTFlags;				// signal EvUARTFlag that Tx data is sent
	p1.L = _EvUARTFlags;
	r0 = [ p1 ];
	r2 = 1;								// option = OS_FLAG_SET
	r3.H = __OSErr;						// address of error var
	r3.L = __OSErr;
	[ --sp ] = r3;						// save args on stack
	[ --sp ] = r2;
	[ --sp ] = r1;						
	[ --sp ] = r0;						
	call _OSFlagPost;					// OSFlagPost();
	unlink;

	p1.H = _OSIntNesting;				// grind OS Int Nesting level
	p1.L = _OSIntNesting;
	r0 = [ p1 ];
	r0 += -1;				
	[ p1 ] = r0;


	call _CpuRestoreContext;			// restore register context
	rets = [ sp++ ];					// restore sys regs
	fp = [ sp++ ];

//	jump __InternalUARTIntE;
	jump __InternalUARTIntL;

	
	
//----------------------------	
// Receive Error
//----------------------------
	
__InternalUARTIntErr:
	p1.H = ( UART_LSR >>16) & 0xFFFF;
	p1.L = ( UART_LSR & 0xFFFF );
	r0 = W [ p1 ] (Z);
//	jump __InternalUARTIntE;
	jump __InternalUARTIntL;
		

//////////////////
// ISR Postamble
/////////////////
	
__InternalUARTIntE:

	astat = [ sp++ ];				// restore sys regs
	reti = [ sp++ ];
	
	r0 = [ sp++ ];
	sti r0;
	p1 = [ sp++ ];
	r1 = [ sp++ ];
	r0 = [ sp++ ];	

	rti;				
	
_InternalUARTInt.end:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一级视频| 蜜桃在线一区二区三区| 欧美日韩精品欧美日韩精品一综合| 日韩精品亚洲一区| 中文字幕在线免费不卡| 日韩一卡二卡三卡四卡| 色综合久久综合网97色综合| 麻豆91精品视频| 亚洲曰韩产成在线| 亚洲国产成人午夜在线一区| 日韩写真欧美这视频| 色婷婷av一区二区三区大白胸| 免费精品视频在线| 亚洲一区在线观看免费| 国产欧美日韩卡一| 精品久久一区二区三区| 欧美日韩成人综合天天影院| 97久久精品人人做人人爽50路| 麻豆精品国产传媒mv男同| 亚洲国产另类av| 亚洲日本在线天堂| 国产精品污www在线观看| 亚洲精品一区二区三区蜜桃下载| 欧美日韩精品电影| 日本韩国欧美一区| 99久久777色| 国产伦精品一区二区三区免费| 丝瓜av网站精品一区二区| 中文字幕欧美区| 在线播放欧美女士性生活| 色拍拍在线精品视频8848| 成人99免费视频| 国产高清在线精品| 国产美女精品一区二区三区| 精品制服美女久久| 看片网站欧美日韩| 精品制服美女丁香| 国产乱色国产精品免费视频| 九九久久精品视频| 国内精品伊人久久久久影院对白| 奇米一区二区三区| 美女一区二区视频| 韩国成人精品a∨在线观看| 精品一区二区综合| 国内外成人在线| 国产一区二区三区在线观看免费视频| 久久99精品网久久| 国产乱码精品一区二区三区五月婷| 蜜臀av一区二区在线免费观看| 日韩av中文在线观看| 日本vs亚洲vs韩国一区三区二区 | 九九视频精品免费| 精品一区二区在线播放| 韩日精品视频一区| 国产乱子伦一区二区三区国色天香 | 9191国产精品| 欧美一区二区在线免费播放| 日韩午夜三级在线| 久久综合九色综合97_久久久| 2014亚洲片线观看视频免费| 国产三级久久久| 亚洲欧洲综合另类在线| 亚洲国产乱码最新视频| 久久99精品一区二区三区三区| 国产高清精品久久久久| jizz一区二区| 欧美性猛交xxxxxx富婆| 日韩一区二区精品在线观看| 久久午夜羞羞影院免费观看| 国产精品二三区| 亚洲国产成人porn| 韩国视频一区二区| 91在线一区二区| 欧美日韩精品欧美日韩精品一综合| 精品国产伦理网| 亚洲欧美乱综合| 另类综合日韩欧美亚洲| 99re成人在线| 欧美电影免费观看高清完整版在线观看| 久久人人97超碰com| 亚洲免费观看在线视频| 蜜臀av在线播放一区二区三区| 成人爱爱电影网址| 91精品国产一区二区三区| 国产女人18水真多18精品一级做| 一区二区三区波多野结衣在线观看 | 国产欧美一区视频| 亚洲午夜日本在线观看| 韩国毛片一区二区三区| 91福利在线看| 欧美激情综合网| 性感美女久久精品| 成人少妇影院yyyy| 日韩一区二区免费在线电影| 亚洲色图视频网站| 精品一区二区三区蜜桃| 91久久一区二区| 久久久久国产一区二区三区四区| 依依成人精品视频| 国产成人一区二区精品非洲| 欧美欧美午夜aⅴ在线观看| 国产欧美日韩亚州综合| 视频一区在线视频| 一本久久综合亚洲鲁鲁五月天| 26uuu精品一区二区在线观看| 亚洲高清免费视频| 成人国产精品免费观看| xvideos.蜜桃一区二区| 五月天激情小说综合| 99久久伊人精品| 久久丝袜美腿综合| 不卡高清视频专区| 日韩视频一区二区| 亚洲国产aⅴ天堂久久| 91免费精品国自产拍在线不卡| 欧美精品一区二区蜜臀亚洲| 日本免费在线视频不卡一不卡二| 91麻豆精东视频| 国产精品麻豆99久久久久久| 国产一区美女在线| 欧美一级精品在线| 五月婷婷欧美视频| 欧美视频中文一区二区三区在线观看| 亚洲国产精品黑人久久久| 毛片基地黄久久久久久天堂| 欧美日韩国产高清一区二区| 亚洲一二三级电影| 欧美午夜电影网| 亚洲香肠在线观看| 欧美性猛交xxxx乱大交退制版 | 国产99久久久国产精品免费看| 欧美岛国在线观看| 久久精品国产99| 欧美xxxxx牲另类人与| 蜜桃av一区二区在线观看| 91麻豆精品国产91久久久使用方法| 亚洲欧美另类久久久精品| av成人老司机| 综合色中文字幕| 色播五月激情综合网| 亚洲精品国久久99热| 色嗨嗨av一区二区三区| 午夜精品一区二区三区电影天堂| 在线观看日韩高清av| 亚洲视频一二三| 在线观看www91| 三级欧美韩日大片在线看| 日韩一区二区三区在线观看| 轻轻草成人在线| 久久在线免费观看| 国产成a人亚洲精品| 国产精品久久久久三级| 91污片在线观看| 亚洲h动漫在线| 精品免费国产一区二区三区四区| 久久av老司机精品网站导航| 精品91自产拍在线观看一区| 成人一区二区视频| 亚洲免费观看高清| 欧美三级电影网站| 精品亚洲成a人在线观看| 久久久国产午夜精品| 不卡视频在线看| 亚洲大型综合色站| 亚洲精品一区二区三区福利| 成人一区二区三区视频在线观看| 亚洲免费观看高清完整版在线 | 在线中文字幕不卡| 天天影视色香欲综合网老头| 日韩精品一区二区三区四区视频 | 精品视频在线视频| 免费成人在线视频观看| 欧美激情自拍偷拍| 欧美日韩视频一区二区| 精品一区二区在线观看| 亚洲色图.com| 日韩一卡二卡三卡| 成人免费黄色在线| 天涯成人国产亚洲精品一区av| 欧美mv日韩mv| eeuss鲁片一区二区三区| 视频在线观看91| 一区二区中文视频| 日韩欧美一级二级三级| 99精品国产视频| 久久精品国产亚洲一区二区三区 | 亚洲丝袜精品丝袜在线| 欧美刺激午夜性久久久久久久| 成人涩涩免费视频| 美女精品自拍一二三四| 中文字幕一区二区视频| 精品少妇一区二区三区视频免付费| 成人免费视频免费观看| 青草av.久久免费一区| 亚洲欧美日韩国产另类专区| 久久日韩精品一区二区五区| 欧美视频第二页| 成人黄色软件下载| 精品中文字幕一区二区小辣椒 | 国产成人小视频|