реклама на сайте
подробности

 
 
> самописный printf для АВР
Метценгерштейн
сообщение Sep 3 2013, 18:28
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



есть кусок кода printf под STM32- там он работал. Решил его прикрутить и к АВР, но выскакивает ошибка IARa
Error[Pe028]: expression must have a constant value D:\works\projects\...\wiznet_drivers\WIZnet_5100.c 1258
ругается на строчку
Код
printf ("recv_IP -> %s  \r\n", recv_IP);


вот хидер
Код
#ifndef    RS232_H__
#define    RS232_H__
#include    <stdint.h>

extern unsigned char hasinput(void);
extern char getchar(void);
extern void putchar(char);
extern void puts(const char*);
extern void puts_P(const char __flash *);
static uint8_t txdone(void)    { return UCSRA & (1<<TXC); }

#ifndef    CR
#define    CR    "\r\n"
#endif

#define    putString(string) {                \
    static __flash char str[] = string;    \
    puts_P(str);                            \
}

extern int snprintf(char* buf, unsigned int size, const char* fmt, ...);
#define printf(...) do { char printf__buf[256]; snprintf(printf__buf, 256, __VA_ARGS__); putString(printf__buf); } while (0)

#endif    //RS232_H__


что ему не так? Или сишник тоже показать?

Сообщение отредактировал Метценгерштейн - Sep 3 2013, 18:30
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Метценгерштейн
сообщение Sep 3 2013, 19:51
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



нет, не то. Т.к. есть др. проект, где я использую этот же файл и эту же запись- все работает там.

в новый файл я добавил printf и запись
Код
extern int snprintf(char* buf, unsigned int size, const char* fmt, ...);
#define printf(...) \
    do { char printf__buf[32]; \
    snprintf(printf__buf, 32, __VA_ARGS__); \
    putString(printf__buf); } \
    while (0)


и вот этот Сишный кусок
Код
int snprintf(char* buf, unsigned int size, const char* fmt, ...) {
    char* buf_start=buf, * buf_end=buf+size-1;
    const int* va=(int*)(&fmt)+1;
    char tmpbuf[32];
    while (*fmt && buf<buf_end) {
        char c=*fmt++;
        if (c=='%') {
            char* q0=tmpbuf, * q1=tmpbuf;
            int w=0;
            while (*fmt>='0' && *fmt<='9') { w=w*10+(*fmt++)-'0'; }
            c=*fmt++;
            switch (c) {
                case '%': *buf++='%'; break;
                                case 'c': *buf++=(char)(*va++); break;
                case 'd': {
                    int i=*va++, s=0;
                    q0=q1=tmpbuf+sizeof(tmpbuf);
                    if (!w) ++w;
                    if (i<0) { i=-i; s=1; }
                    while (i || w>0) { *--q0='0'+(i%10); i/=10; if (w) --w; }
                    if (s) { *--q0='-'; }
                    break;
                }
                case 'x': {
                    uint32_t x=*va++;
                    q0=q1=tmpbuf+sizeof(tmpbuf);
                    if (!w) ++w;
                    while (x || w>0) { *--q0="0123456789abcdef"[x&0x0F]; x>>=4; if (w) --w; }
                    break;
                }
                                case 's': {
                                    q0=(char*)(*va++);
                                        q1=q0;
                                        while (*q1) ++q1;
                                    break;
                                }
            }
            while (q0<q1 && buf<buf_end) *buf++=*q0++;
        }
        else *buf++=c;
    }
    *buf=0;
    return buf-buf_start;
}

причем этот кусок без проблем компилится и работает под STM32, а тут нет. Разница- различные выводы символа и строки тут и там.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   самописный printf для АВР   Sep 3 2013, 18:28
- - alx.bilous   static __flash char str[] = string; У вас вот тут...   Sep 3 2013, 19:17
|- - demiurg_spb   del.   Sep 3 2013, 20:28
- - alx.bilous   https://www.google.com/search?client=safari...off...   Sep 3 2013, 20:02
- - Метценгерштейн   честно, ничего не понял как это ко мне относится )   Sep 3 2013, 20:17
- - Метценгерштейн   Хорошо, а как объяснить, что раньше работало все д...   Sep 3 2013, 20:38
|- - demiurg_spb   Извините это я ввёл вас в заблуждение. И удалил пр...   Sep 3 2013, 20:42
- - Метценгерштейн   ну а кроме шуток, не могу понять почему на STM32 р...   Sep 3 2013, 20:46
- - andrewlekar   Выкиньте putString и сделайте просто через puts.   Sep 4 2013, 05:28
|- - demiurg_spb   Что происходит если всё же добавить const в следую...   Sep 4 2013, 07:08
- - Метценгерштейн   спасибо за советы, чуть позже опробую их и отпишус...   Sep 4 2013, 07:38
- - XVR   Вам alx.bilous уже сказал. Как вы себе представляе...   Sep 4 2013, 09:00
- - Метценгерштейн   Цитата(XVR @ Sep 4 2013, 13:00) Вам alx.b...   Sep 4 2013, 11:29
- - XVR   Цитата(Метценгерштейн @ Sep 4 2013, 15:29...   Sep 5 2013, 05:43


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016