⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 other.c

📁 在ARM ADS开发环境下,做的一个通过串口下载接收bootloader的程序,包含对flash的操作.
💻 C
字号:
/////////////////////////////////////////////////////////////////////////////////
// Copyright(c) 2001-2002 Hybus Co,.ltd. All rights reserved.
//
// Module name:
//      lstring.c
//
// Description:
//
//
// Author:
//      bedguy
//
// Created:
//      2002.10
//
///////////////////////////////////////////////////////////////////////////////

#include "stdarg.h"
#include "other.h"

static void PrintChar(char *fmt, char c);
static void PrintDec(char *fmt, int value);
static void PrintHex(char *fmt, int value);
static void PrintString(char *fmt, char *cptr);
static int Power(int num, int cnt);


void MemCpy32(void *dest, void *src, int numWords){
	volatile long *s1=dest, *s2=src;
	while(numWords--) {
		*s1++ = *s2++;
	}
	return;
}	// MemCpy32.


void MemCpy(void *dest, void *src, int cnt){
	char *s1=dest, *s2=src, *endptr=(char *)dest+cnt;
	
	while (s1<endptr)
		*s1++ = *s2++;
	return;
}	// MemCpy.


void MemSet(void *dest, char c, int len){
	char *s=dest;
	char *limit = (char *)dest+len;

	while (s < limit) *s++ = c;
}	// MemSet.

/*
int MemCmp(void *addr1, void *addr2, int len){
	volatile char *s1=addr1, *s2=addr2;
	volatile char *endptr = addr1+len;

	while ((ulong)s1 < (ulong)endptr){
		if (*s1++ != *s2++) return *(--s1) - *(--s2);
	}
	return 0;
}	// MemCmp.

*/
void StrCpy(char *dest, char *src){
	volatile char *s1=dest, *s2=src;
	
	while (*s2!=0) *s1++ = *s2++;
	*s1 = 0;
	return;
}	// StrCpy.


int StrLen(char *dest){
	volatile char *tmp = dest;

	if (!tmp) return -1;
	while (*tmp!=0) tmp++;
	return (tmp - dest);
}	// StrLen.


int StrNCmp(char *s1, char *s2, int len){
	int i;

	for(i = 0; i < len; i++){
		if(s1[i] != s2[i])	return ((int)s1[i]) - ((int)s2[i]);
		if(s1[i] == 0)		return 0;
	}
	return 0;
} // StrNCmp.



int StrCmp(char *s1, char *s2){
	for (; *s1 && *s2; s1++, s2++){
		if (*s1 != *s2) return ((int)(*s1) - (int)(*s2));
	}
	if (*s1 || *s2) return ((int)(*s1) - (int)(*s2));
	return 0;
}	// StrCmp.


bool HexToInt(char *s, void *retval, VAR_TYPE type){
	char	c;
	int		i;
	long	rval;

	if (!s || !retval) return false;
	if (!StrNCmp(s, "0x", 2)) s+=2;
	// fine int value.
	for (i=0, rval=0; i<type/4; i++){
		if (*s=='\0'){
			if (i==0) return false;
			else      break;
		}
		c = *s++;

		if      (c>='0' && c<='9') c-='0';
		else if (c>='a' && c<='f') c=c-'a'+10;
		else if (c>='A' && c<='F') c=c-'A'+10;
		else    return false;

		rval = rval<<4 | c;
	}
	// make retval.
	switch (type){
		case 8 :
			*(char *)retval = (char)rval;
			break;
		case 16 :
			*(short *)retval = (short)rval;
			break;
		case 32 :
			*(long *)retval = (long)rval;
			break;
		default :
			return false;
	}
	return true;
}	// HexToInt.


bool DecToLong(char *s, long *retval){
	long remainder;
	if (!s || !s[0]) return false;

	for (*retval=0; *s; s++){
		if (*s < '0' || *s > '9') return false;
		remainder = *s - '0';
		*retval = *retval * 10 + remainder;
	}

	return true;
}	// DecToLong.


void HexDump(char *addr, int len){
	char	*s=addr, *endPtr=(char *)((long)addr+len);
	int		i, remainder=len%16;
	
	printf("\n");
	printf("Offset      Hex Value                                        Ascii value\n");
	
	// print out 16 byte blocks.
	while (s+16<=endPtr){
		// offset 免仿.
		printf("0x%08lx  ", (long)(s-addr));
		// 16 bytes 窜困肺 郴侩 免仿.
		for (i=0; i<16; i++){
			printf("%02x ", s[i]);
		}
		printf(" ");
		for (i=0; i<16; i++){
			if		(s[i]>=32 && s[i]<=125)	printf("%c", s[i]);
			else							printf(".");
		}
		s += 16;
		printf("\n");
	}
	
	// Print out remainder.
	if (remainder){
		// offset 免仿.
		printf("0x%08lx  ", (long)(s-addr));
		// 16 bytes 窜困肺 免仿窍绊 巢篮 巴 免仿.
		for (i=0; i<remainder; i++){
			printf("%02x ", s[i]);
		}
		for (i=0; i<(16-remainder); i++){
			printf("   ");
		}
		printf(" ");
		for (i=0; i<remainder; i++){
			if		(s[i]>=32 && s[i]<=125)	printf("%c", s[i]);
			else							printf(".");
		}
		for (i=0; i<(16-remainder); i++){
			printf(" ");
		}
		printf("\n");
	}
	return;
}	// HexDump.









void printf(char *fmt, ...){
	int		i;
	va_list args;
	
	char	*s=fmt;
	
	char	format[10];		// fmt狼 牢磊啊 "%08lx"扼搁, "08l"甫 烙矫肺 扁废.
	
	va_start(args, fmt);
	while (*s){
		if (*s=='%'){
			s++;
			// s俊辑 "%08lx"屈侥阑 啊廉客 format俊 扁废. 唱吝俊 免仿窃荐俊 逞败淋.
			format[0] = '%';
			for (i=1; i<10;){
				if (*s=='c' || *s=='d' || *s=='x' || *s=='s' || *s=='%'){
					format[i++] = *s;
					format[i] = '\0';
					break;
				}
				else {
					format[i++] = *s++;
				}
			}
			// "%s", "%c", "%d", "%x"甫 茫酒 免仿且 窃荐 龋免.
			switch (*s++){
				case 'c' :
					PrintChar(format, va_arg(args, int));
					break;
				case 'd' :
					PrintDec(format, va_arg(args, int));
					break;
				case 'x' :
					PrintHex(format, va_arg(args, int));
					break;
				case 's' :
					PrintString(format, va_arg(args, char *));
					break;
				case '%' :
					PrintChar("%c", '%');
					break;//
			}
		}
		else {
			PrintChar("%c", *s);
			s++;
		}
	}
	va_end(args);
	return;
}












void PrintChar(char *fmt, char c){
	SerialOutputByte(c);
	return;
}


void PrintDec(char *fmt, int l){
	int		i, j;
	char	c, *s=fmt, tol[10];
	bool	flag0=false, flagl=false;	// "%08lx"俊辑 '0', 'l'狼 粮犁 咯何.
	long	flagcnt=0;					// "%08lx"俊辑 "8"阑 茫酒辑 long屈栏肺.
	bool	leading_zero=true;			// long屈狼 data甫 免仿窍扁 困茄 函荐.
	long	divisor, result, remainder;

	// fmt狼 "%08lx"俊辑 '0', '8', 'l'阑 秦籍.
	for (i=0; (c=s[i]); i++){
		if (c=='d') break;
		else if (c>='1' && c<='9'){
			for (j=0; s[i]>='0' && s[i]<='9'; j++){
				tol[j] = s[i++];
			}
			tol[j] = '\0';
			i--;
			DecToLong(tol, &flagcnt);
		}
		else if (c=='0') flag0=true;
		else if (c=='l') flagl=true;
		else continue;
	}

	// 困狼 flag俊 蝶扼 免仿.
	if (flagcnt){
		if (flagcnt>9) flagcnt=9;
		remainder = l%(Power(10, flagcnt));	// flagcnt焊促 拉磊府狼 荐绰 吧矾晨. 199俊 flagcnt==2捞搁, 99父.

		for (divisor=Power(10, flagcnt-1); divisor>0; divisor/=10){
			result = remainder/divisor;
			remainder %= divisor;

			if (result!=0 || divisor==1) leading_zero = false;

			if (leading_zero==true){
				if (flag0)	SerialOutputByte('0');
				else		SerialOutputByte(' ');
			}
			else SerialOutputByte((char)(result)+'0');
		}
	} else {
		remainder = l;

		for (divisor=1000000000; divisor>0; divisor/=10){
			result = remainder/divisor;
			remainder %= divisor;

			if (result!=0 || divisor==1) leading_zero = false;
			if (leading_zero==false) SerialOutputByte((char)(result)+'0');
		}
	}
	return;
}


void PrintHex(char *fmt, int l){
	int		i, j;
	char	c, *s=fmt, tol[10];
	bool	flag0=false, flagl=false;	// flags.
	long	flagcnt=0;
	bool	leading_zero=true;
	char	uHex, lHex;
	int		cnt;						// "%5x"狼 版快 5俺父 免仿窍档废 免仿茄 俺荐.

	// fmt狼 "%08lx"俊辑 '0', '8', 'l'阑 秦籍.
	for (i=0; (c=s[i]); i++){
		if (c=='x') break;
		else if (c>='1' && c<='9'){
			for (j=0; s[i]>='0' && s[i]<='9'; j++){
				tol[j] = s[i++];
			}
			tol[j] = '\0';
			i--;
			DecToLong(tol, &flagcnt);
		}
		else if (c=='0') flag0=true;
		else if (c=='l') flagl=true;
		else continue;
	}

	s = (char *)(&l);
	l = SWAP32(l);		// little, big endian俊 蝶扼辑.(big捞 免仿窍扁 浆况 鉴辑甫 官厕)
	
	// 困狼 flag俊 蝶扼 免仿.
	if (flagcnt){
		if (flagcnt&0x01){	// flagcnt啊 圈荐 老锭, upper甫 公矫, lower父 免仿.
			c = s[(8-(flagcnt+1))/2]; // 圈荐 老锭 弊 困摹甫 器窃窍绰 镑狼 蔼阑 啊廉 可聪促.
			
			// lower 4 bits甫 啊廉客辑 ascii code肺.
			lHex = ((c>>0)&0x0f);
			if (lHex!=0) leading_zero=false;
			if (lHex<10) lHex+='0';
			else         lHex+='A'-10;

			// lower 4 bits 免仿.
			if (leading_zero){
				if (flag0) SerialOutputByte('0');
				else       SerialOutputByte(' ');
			}
			else SerialOutputByte(lHex);
			
			flagcnt--;
		}

		// byte窜困狼 data甫 Hex肺 免仿.
		for (cnt=0, i=(8-flagcnt)/2; i<4; i++){
			c = s[i];
				
			// get upper 4 bits and lower 4 bits.
			uHex = ((c>>4)&0x0f);
			lHex = ((c>>0)&0x0f);

			// upper 4 bits and lower 4 bits to '0'~'9', 'A'~'F'.
			// upper 4 bits甫 ascii code肺.
			if (uHex!=0) leading_zero = false;
			if (uHex<10) uHex+='0';
			else         uHex+='A'-10;

			// upper 4 bits 免仿.
			if (leading_zero){
				if (flag0) SerialOutputByte('0');
				else       SerialOutputByte(' ');
			}
			else SerialOutputByte(uHex);
			
			// lower 4 bits甫 ascii code肺.
			if (lHex!=0) leading_zero = false;
			if (lHex<10) lHex+='0';
			else         lHex+='A'-10;

			// lower 4 bits 免仿.
			if (leading_zero){
				if (flag0) SerialOutputByte('0');
				else       SerialOutputByte(' ');
			}
			else SerialOutputByte(lHex);
		}
	}
	else {
		for (i=0; i<4; i++){
			c = s[i];
	
			// get upper 4 bits and lower 4 bits.
			uHex = ((c>>4)&0x0f);
			lHex = ((c>>0)&0x0f);

			// upper 4 bits and lower 4 bits to '0'~'9', 'A'~'F'.
			if (uHex!=0) leading_zero = false;
			if (uHex<10) uHex+='0';
			else         uHex+='A'-10;
			if (!leading_zero) SerialOutputByte(uHex);
			
			if (lHex!=0 || i==3) leading_zero = false;
			if (lHex<10) lHex+='0';
			else         lHex+='A'-10;
			if (!leading_zero) SerialOutputByte(lHex);
		}
	}
	return;
}


void PrintString(char *fmt, char *s){
	if (!fmt || !s) return;
	while (*s) SerialOutputByte(*s++);
	return;
}


int Power(int num, int cnt){
	long retval=num;
	cnt--;

	while (cnt--){
		retval *= num;
	}
	return retval;
}



void ClearLine(void){
	printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
		   "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
	return;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -