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

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

?? driv_internal_uart_asm.s

?? UCOS-II2.76在ADI-BF533上的移植.在UCOS-II網(wǎng)站提供的源碼基礎上修改了幾處匯編代碼.采用2.76版系統(tǒng)內(nèi)核移植,在DSP++4.0上調(diào)試成功
?? 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一区二区三区免费野_久草精品视频
久久久久久久综合日本| 久久国内精品自在自线400部| 亚洲最大成人网4388xx| 久草在线在线精品观看| 91久久精品网| 国产精品情趣视频| 日本va欧美va精品发布| 色诱亚洲精品久久久久久| 久久先锋影音av鲁色资源网| 亚洲四区在线观看| 国产九色sp调教91| 日韩欧美国产系列| 日韩不卡在线观看日韩不卡视频| fc2成人免费人成在线观看播放| 日韩欧美一级片| 天堂在线亚洲视频| 色婷婷香蕉在线一区二区| 国产亚洲精品aa午夜观看| 欧美a级理论片| 欧美一区二区免费| 日本中文在线一区| 8x8x8国产精品| 日韩av中文字幕一区二区三区| 在线观看av一区二区| 中文字幕日韩一区| 成人在线视频一区| 国产精品午夜在线观看| 高清日韩电视剧大全免费| 精品国产区一区| 久久福利资源站| 精品免费一区二区三区| 日韩av一级片| 欧美tickling网站挠脚心| 肉肉av福利一精品导航| 777精品伊人久久久久大香线蕉| 一区二区国产盗摄色噜噜| 在线区一区二视频| 亚洲一区二区在线视频| 精品视频在线免费| 日韩av一区二| 精品国产91洋老外米糕| 国产一区二区伦理片| 久久久久久毛片| 99re这里只有精品首页| 亚洲另类中文字| 欧美日韩中字一区| 奇米在线7777在线精品| 亚洲精品一区二区在线观看| 国产呦萝稀缺另类资源| 国产精品久久久久一区二区三区共| 懂色av一区二区在线播放| 中文字幕一区二区5566日韩| 91免费视频网| 喷水一区二区三区| 精品国产污网站| 99这里只有精品| 婷婷综合五月天| 精品日韩在线观看| 国产91在线看| 伊人婷婷欧美激情| 日韩免费视频一区二区| 成人午夜在线播放| 亚洲国产日日夜夜| 精品国产露脸精彩对白| 成人av电影在线网| 亚洲成av人片在线观看无码| 欧美一级片免费看| 国产激情精品久久久第一区二区| 最新久久zyz资源站| 8x8x8国产精品| 成人污污视频在线观看| 日韩精品一级中文字幕精品视频免费观看 | 日韩主播视频在线| 久久久久久免费毛片精品| 97精品国产露脸对白| 毛片一区二区三区| 亚洲一区在线电影| 欧美国产成人精品| 欧美一区二区三区人| 91视频在线观看免费| 久久国产麻豆精品| 亚洲国产成人porn| 中文字幕一区二区三区视频| 日韩欧美一区在线| 欧美三级在线看| 99国产精品久| 国产不卡视频在线观看| 青青草国产精品97视觉盛宴| 亚洲欧美电影一区二区| 国产性色一区二区| 日韩精品最新网址| 欧美日韩国产影片| 色一区在线观看| 暴力调教一区二区三区| 精品一区二区三区日韩| 日韩精品亚洲一区二区三区免费| 亚洲色图清纯唯美| 中文av字幕一区| 国产日韩精品一区| 久久久青草青青国产亚洲免观| 欧美日韩情趣电影| 91久久精品一区二区二区| 成人97人人超碰人人99| 国产69精品久久久久毛片| 久久成人免费日本黄色| 日本欧美肥老太交大片| 亚洲va国产va欧美va观看| 亚洲免费高清视频在线| 亚洲精品你懂的| 亚洲婷婷在线视频| 综合久久国产九一剧情麻豆| 国产日韩精品一区| 国产精品伦理在线| 国产精品视频一二| 国产精品久久久久久亚洲伦| 久久精品在线免费观看| 久久精子c满五个校花| 久久一日本道色综合| 国产婷婷一区二区| 亚洲国产经典视频| 中文字幕中文乱码欧美一区二区| 亚洲国产高清不卡| 中文字幕一区日韩精品欧美| 中文字幕在线视频一区| 综合中文字幕亚洲| 亚洲成人精品一区二区| 奇米综合一区二区三区精品视频| 日本亚洲三级在线| 国内成+人亚洲+欧美+综合在线 | 欧美精品xxxxbbbb| 6080国产精品一区二区| 精品国产成人在线影院| 久久精品人人做| 欧美国产乱子伦| 亚洲综合精品久久| 美女精品自拍一二三四| 国内精品国产三级国产a久久 | 蜜臂av日日欢夜夜爽一区| 极品瑜伽女神91| 99久久精品免费看国产免费软件| 色综合天天性综合| 欧美一区二区黄| 久久久电影一区二区三区| 日韩一区在线看| 三级不卡在线观看| 丁香婷婷综合色啪| 欧美日韩成人在线一区| 26uuu国产日韩综合| 国产精品成人网| 蜜臀久久99精品久久久久久9| 国产风韵犹存在线视精品| 91高清视频在线| 欧美精品一区二区三区高清aⅴ| 欧美国产一区在线| 日日夜夜免费精品| 成人av在线影院| 欧美一区二区三区男人的天堂| 国产精品乱人伦一区二区| 日韩**一区毛片| 91麻豆成人久久精品二区三区| 欧美不卡一区二区三区| 一区二区三区欧美久久| 国产一区二区美女诱惑| 欧美日本不卡视频| 欧美国产日韩精品免费观看| 日本一不卡视频| 日本韩国精品在线| 日本一区二区三区dvd视频在线 | 欧美日韩aaaaaa| 中文字幕一区二区视频| 久久疯狂做爰流白浆xx| 欧美亚洲一区二区在线| 国产精品久久99| 国产一区二区三区电影在线观看| 久久久久久久综合色一本| 日韩影院免费视频| 欧美三级中文字幕| 亚洲精品国产一区二区三区四区在线| 国产精品一二三四五| 在线观看91av| 亚洲在线观看免费| 一本一道波多野结衣一区二区| 久久香蕉国产线看观看99| 热久久免费视频| 91精品国产手机| 天天av天天翘天天综合网| 色域天天综合网| 亚洲男人的天堂在线观看| 成人a区在线观看| 国产精品护士白丝一区av| 国产美女久久久久| 2021久久国产精品不只是精品| 美女视频第一区二区三区免费观看网站| 日本高清不卡aⅴ免费网站| 亚洲另类一区二区| 色婷婷一区二区| 亚洲国产成人高清精品| 欧美日韩精品电影| 日本不卡一区二区三区高清视频| 欧美久久久久久久久久|