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

📄 kservice.c.svn-base

📁 RT-Thread是发展中的下一代微内核嵌入式实时操作系统
💻 SVN-BASE
字号:
/* * File      : kservice.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006, RT-Thread Development Team * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://openlab.rt-thread.com/license/LICENSE * * Change Logs: * Date           Author       Notes * 2006-03-16     Bernard      the first version * 2006-05-25     Bernard      rewrite vsprintf * 2006-08-10     Bernard      add rt_show_version */#include <rtthread.h>#include <rthw.h>/** * @addtogroup KernelService *//*@{*//** * This function will set the content of memory to specified value * * @param s the address of source memory * @param c the value shall be set in content * @param count the copied length * * @return the address of source memory * */void *rt_memset(void * s, int c, rt_uint16 count){    char *xs = (char *) s;    while (count--)        *xs++ = c;    return s;}/** * This function will copy memory content from source address to destination * address. * * @param dest the address of destination memory * @param src  the address of source memory * @param count the copied length * * @return the address of destination memory * */void *rt_memcpy(void *dest, const void *src, rt_uint16 count){    char *tmp = (char *) dest, *s = (char *) src;    while (count--)        *tmp++ = *s++;    return dest;}/** * This function will compare two strings with specified maximum length * * @param cs the string to be compared * @param ct the string to be compared * @param count the maximum compare length * * @return the result */rt_uint16 rt_strncmp(const char * cs, const char * ct, rt_uint16 count){    register signed char __res = 0;    while (count)    {        if ((__res = *cs - *ct++) != 0 || !*cs++)            break;        count--;    }    return __res;}/** * This function will return the length of a string, which terminate will  * null character. * * @param s the string * * @return the length of string */rt_uint16 rt_strlen(const char *s){    const char *sc;    for (sc = s; *sc != '\0'; ++sc) /* nothing */        ;    return sc - s;}/** * This function will show the version of rt-thread rtos */void rt_show_version(void){	rt_kprintf(" \\ | /\n");	rt_kprintf("- RT - Thread Operating System\n");	rt_kprintf(" / | \\ 0.%d.%d build %s\n", RT_VERSION, RT_SUBVERSION, __DATE__);	rt_kprintf(" 2006 Copyright by rt-thread team\n");}static char rt_log_buf[RT_CONSOLEBUF_SIZE]; /* Message log buffer *//* private function */#define isdigit(c)  ((unsigned)((c) - '0') < 10)rt_inline rt_int32 divide(rt_int32 *n, rt_int32 base){    rt_int32 res;	/* optimized for processor which does not support divide instructions. */    if (base == 10)    {        res = ((rt_uint32)*n) % 10U;        *n = ((rt_uint32)*n) / 10U;    }    else    {        res = ((rt_uint32)*n) % 16U;        *n = ((rt_uint32)*n) / 16U;    }    return res;}rt_inline int skip_atoi(const char **s){    register int i=0;    while (isdigit(**s)) i = i*10 + *((*s)++) - '0';    return i;}#define ZEROPAD 	(1 << 0)	/* pad with zero */#define SIGN 		(1 << 1)	/* unsigned/signed long */#define PLUS 		(1 << 2)	/* show plus */#define SPACE 		(1 << 3)	/* space if plus */#define LEFT 		(1 << 4)	/* left justified */#define SPECIAL 	(1 << 5)	/* 0x */#define LARGE		(1 << 6)	/* use 'ABCDEF' instead of 'abcdef' */#ifdef RT_PRINTF_PRECISIONstatic char *print_number(char * buf, char * end, long num, int base, int s, int precision, int type)#elsestatic char *print_number(char * buf, char * end, long num, int base, int s, int type)#endif{    char c, sign;#ifdef RT_PRINTF_LONGLONG    char tmp[32];#else	char tmp[16];#endif    const char *digits;    static const char small_digits[] = "0123456789abcdef";    static const char large_digits[] = "0123456789ABCDEF";    register int i;    register int size;	size = s;    digits = (type & LARGE) ? large_digits : small_digits;    if (type & LEFT) type &= ~ZEROPAD;    c = (type & ZEROPAD) ? '0' : ' ';        /* get sign */    sign = 0;    if (type & SIGN)    {        if (num < 0)        {            sign = '-';            num = -num;        }        else if (type & PLUS) sign = '+';        else if (type & SPACE) sign = ' ';    }#ifdef RT_PRINTF_SPECIAL    if (type & SPECIAL)    {        if (base == 16) size -= 2;        else if (base == 8) size--;    }#endif    i = 0;    if (num == 0) tmp[i++]='0';    else    {        while (num != 0) tmp[i++] = digits[divide(&num, base)];    }#ifdef RT_PRINTF_PRECISION    if (i > precision) precision = i;    size -= precision;#else	size -= i;#endif    if (!(type&(ZEROPAD | LEFT)))    {        while(size-->0)        {            if (buf <= end) *buf = ' ';            ++buf;        }    }    if (sign)    {        if (buf <= end)        {			*buf = sign;			--size;		}        ++buf;    }#ifdef RT_PRINTF_SPECIAL    if (type & SPECIAL)    {        if (base==8)        {            if (buf <= end) *buf = '0';            ++buf;        }        else if (base==16)        {            if (buf <= end) *buf = '0';            ++buf;            if (buf <= end)            {				*buf = type & LARGE? 'X' : 'x';			}            ++buf;        }    }#endif	/* no align to the left */    if (!(type & LEFT))    {        while (size-- > 0)        {            if (buf <= end) *buf = c;            ++buf;        }    }#ifdef RT_PRINTF_PRECISION    while (i < precision--)    {        if (buf <= end) *buf = '0';        ++buf;    }#endif	/* put number in the temporary buffer */    while (i-- > 0)    {        if (buf <= end) *buf = tmp[i];        ++buf;    }    while (size-- > 0)    {        if (buf <= end) *buf = ' ';        ++buf;    }    return buf;}static rt_int32 vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args){#ifdef RT_PRINTF_LONGLONG    unsigned long long num;#else	rt_uint32 num;#endif    int i, len;    char *str, *end, c;    const char *s;	rt_uint8 base;			/* the base of number */    rt_uint8 flags;			/* flags to print number */    rt_uint8 qualifier;		/* 'h', 'l', or 'L' for integer fields */
    rt_int32 field_width;	/* width of output field */#ifdef RT_PRINTF_PRECISION    int precision;		/* min. # of digits for integers and max for a string */#endif    str = buf;    end = buf + size - 1;    for (; *fmt ; ++fmt)    {        if (*fmt != '%')        {            if (str <= end) *str = *fmt;            ++str;            continue;        }                /* process flags */        flags = 0;        		while(1)		{			/* skips the first '%' also */			++fmt;			if (*fmt == '-') flags |= LEFT;			else if (*fmt == '+') flags |= PLUS;			else if (*fmt == ' ') flags |= SPACE;			else if (*fmt == '#') flags |= SPECIAL;			else if (*fmt == '0') flags |= ZEROPAD;			else break;		}        /* get field width */        field_width = -1;        if (isdigit(*fmt)) field_width = skip_atoi(&fmt);        else if (*fmt == '*')        {            ++fmt;            /* it's the next argument */            field_width = va_arg(args, int);            if (field_width < 0)            {                field_width = -field_width;                flags |= LEFT;            }        }#ifdef RT_PRINTF_PRECISION        /* get the precision */        precision = -1;        if (*fmt == '.')        {            ++fmt;            if (isdigit(*fmt)) precision = skip_atoi(&fmt);            else if (*fmt == '*')            {                ++fmt;                /* it's the next argument */                precision = va_arg(args, int);            }            if (precision < 0) precision = 0;        }#endif        /* get the conversion qualifier */        qualifier = 0;        if (*fmt == 'h' || *fmt == 'l'#ifdef RT_PRINTF_LONGLONG		|| *fmt == 'L'#endif		)        {            qualifier = *fmt;            ++fmt;#ifdef RT_PRINTF_LONGLONG                        if (qualifier == 'l' && *fmt == 'l')            {                qualifier = 'L';                ++fmt;            }#endif        }                /* the default base */        base = 10;                switch (*fmt)        {		case 'c':            if (!(flags & LEFT))            {                while (--field_width > 0)                {                    if (str <= end) *str = ' ';                    ++str;                }            }                        /* get character */            c = (rt_uint8) va_arg(args, int);            if (str <= end) *str = c;            ++str;                        /* put width */            while (--field_width > 0)            {                if (str <= end) *str = ' ';                ++str;            }            continue;            		case 's':            s = va_arg(args, char *);            if (!s) s = "(NULL)";            			len = rt_strlen(s);#ifdef RT_PRINTF_PRECISION			if (precision > 0 && len > precision) len = precision;#endif			            if (!(flags & LEFT))            {                while (len < field_width--)                {                    if (str <= end) *str = ' ';                    ++str;                }            }                        for (i = 0; i < len; ++i)            {                if (str <= end) *str = *s;                ++str;                ++s;            }                        while (len < field_width--)            {                if (str <= end) *str = ' ';                ++str;            }            continue;            		case 'p':            if (field_width == -1)            {                field_width = sizeof(void *) << 1;                flags |= ZEROPAD;            }#ifdef RT_PRINTF_PRECISION            str = print_number(str, end,                         (long) va_arg(args, void *),                         16, field_width, precision, flags);#else            str = print_number(str, end,                         (long) va_arg(args, void *),                         16, field_width, flags);#endif            continue;            		case '%':            if (str <= end) *str = '%';            ++str;            continue;            		/* integer number formats - set up the flags and "break" */		case 'o':            base = 8;            break;            		case 'X':            flags |= LARGE;		case 'x':            base = 16;            break;            		case 'd':		case 'i':            flags |= SIGN;		case 'u':            break;            		default:            if (str <= end) *str = '%';            ++str;                        if (*fmt)            {                if (str <= end) *str = *fmt;                ++str;            }            else            {                --fmt;            }            continue;        }#ifdef RT_PRINTF_LONGLONG        if (qualifier == 'L') num = va_arg(args, long long);        else if (qualifier == 'l')#else        if (qualifier == 'l')#endif        {            num = va_arg(args, rt_uint32);            if (flags & SIGN) num = (rt_int32) num;        }        else if (qualifier == 'h')        {            num = (rt_uint16) va_arg(args, rt_int32);            if (flags & SIGN) num = (rt_int16) num;        }        else        {            num = va_arg(args, rt_uint32);            if (flags & SIGN) num = (rt_int32) num;        }#ifdef RT_PRINTF_PRECISION        str = print_number(str, end, num, base, field_width, precision, flags);#else        str = print_number(str, end, num, base, field_width, flags);#endif    }    if (str <= end) *str = '\0';    else *end = '\0';    /* the trailing null byte doesn't count towards the total    * ++str;    */    return str-buf;}/** * This function will fill a formatted string to buffer * * @param buf the buffer to save formatted string * @param size the buffer size * @param fmt the format */void rt_snprintf(char *buf, rt_size_t size, const char *fmt, ...){    va_list args;    va_start(args, fmt);    vsnprintf(buf, size, fmt, args);    va_end(args);}/** * This function will print a formatted string on system console * * @param fmt the format */void rt_kprintf(const char *fmt, ...){    va_list args;    va_start(args, fmt);    vsnprintf(rt_log_buf, sizeof(rt_log_buf), fmt, args);    rt_console_puts(rt_log_buf);    va_end(args);}/*@}*/

⌨️ 快捷键说明

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