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

 
 
> Ламерские вопросы по Си, перехожу с асма
Alt.F4
сообщение May 19 2012, 06:34
Сообщение #1


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

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Добрый день.
Копаю интернет, но все как-то безуспешно.
Хочу написать функцию передачи строки по UART, работающую по прерыванию. Причем строка может быть как константа (храниться во флэш), так и переменная (храниться в СОЗУ).
Код
#define size_TX0     10
volatile static int8_t    count_TX0;//кол-во непереданных символов в буфере UART0
volatile static int8_t    index_TX0;//адресация в буфере передачи UART0
volatile static int8_t     bufferTX0[size_TX0];//массив - буфер передачи UART0
/*==============================*/
void send_UART0(char *string)
{
int8_t    i;
for(i=0;*string!='\0';i++)
    {
        bufferTX0[i]=(*string);    //сохраняем строку в буфер
        string++;
        count_TX0++;                //считаем символы
    }
index_TX0=0;                        //обнуляем адресацию в буфере
sbi(UCSR0B,UDRIE0);                    //запускаем прерывание
}
/*==============================*/
ISR(USART0_UDRE_vect)
{
    UDR0 = bufferTX0[index_TX0++];                // Берем данные из буффера.
    if(index_TX0==count_TX0)  cbi(UCSR0B,UDRIE0);    // Если все передали, то выкл.прерывание
}
/*==============================*/

Пишу send_UART0("12345");, но эти 12345 сохраняются в СОЗУ.
Вопрос: как передать в функцию строку, чтобы она сохранилась во флэш?
Спасибо.

Сообщение отредактировал Alt.F4 - May 19 2012, 06:36
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение May 19 2012, 07:54
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Хм... Я не силён в терминологии разряда «цветовой дифференциации штанов», но в моём понимании «ламер» означает человека, который не просто не знает чего-то (все чего-то не знают *) ), а и не желает разобраться и при этом ещё пробует учить других. «ламерский вопрос» при этом редкость и обычно сам он своим уровнем хорошо показывает, что в предыдущих своих сообщениях человек с умным видом рассуждал о том, чего совершенно не знает.
«нуб», в отличие от «ламера», хочет что-от узнать.
Один и тот же вопрос может быть «ламерским» или «чайниковским» в зависимости от того, кто его задал (от предистории).
Ну да не важно.


Судя по тому, что соседний вопрос был по AVR Studio, используется avr-gcc.
У него до версии 4.7 не поддерживаются разные пространства памяти и соответствующие модификаторы указателей (да и в 4.7, если я правильно понял, это есть в C frontend, но нет в C++).
Так что нужно использовать атрибут размещения из avr/pgmspace.h
Универсальную функцию написать можно, сначала придумав, как передавать признак ОЗУ/флеш.
Две специальных написать проще и результат не хуже. И это будет выглядеть как-то так:
CODE
#include <avr/pgmspace.h>

#define size_TX0 10

// беззнаковые счётчики и индексы дают код короче и быстрее
volatile static unt8_t count_TX0; //кол-во непереданных символов в буфере UART0
volatile static unt8_t index_TX0; //адресация в буфере передачи UART0
// char так char, какая нам разница, какой размер и знак у символов
volatile static char bufferTX0[size_TX0];//массив - буфер передачи UART0
...

void wait_UART0()
{
while (UCSR0B & (1<<UDRIE0)) {}
}

void start_UART0()
{
index_TX0 = 0;
UCSR0B |= (1<<UDRIE0);
}

// Строка из ОЗУ
void send_UART0(char *string)
{
char *dst = buffer_TX0;
char ch;

wait_UART0(); // надо ведь дождаться, пока уйдёт предыдущая строка

count_TX0 = 0;

// бесконечный цикл, тут прямо в условие действия затолкать для новичка возможно слишком уж нечитаемо выйдет
for (;;) {
ch = *string++;
// если достигнут конец строки или уже нет местя в буфере — выходим
if (ch == '\0' || ++count_TX0 >= size_TX0) break;
*dst++ = ch;
}

start_UART0();
}

...
// Строка из флеша.
// Увы, нормальной поддержки указатеелй во флеше нет, поэтому проще не обманывать себя
void send_UART0_P(unsigned string_address)
{
char *dst = buffer_TX0;
char ch;

wait_UART0();

count_TX0 = 0;

for (;;) {
ch = pgm_read_byte(string_address);
++string_address;
if ( ch == '\0' || ++count_TX0 >= size_TX0) break;
*dst++ = ch;
}

start_UART0();
}

...
send_UART0_P( PSTR("Temperature: ") ); // эта строка не попадёт в ОЗУ
char tmpbuf[size_TX0];
// к примеру, преобразовали в буфер число
send_UART0( tmpbuf );
send_UART0_P( PSTR("\r\n") ); // эта строка не попадёт в ОЗУ


____________
*) Не знать — не стыдно. Стыдно не хотеть узнать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alt.F4   Ламерские вопросы по Си   May 19 2012, 06:34
- - Dog Pawlowa   Если нужно флэш, то как-то так: __flash char my_st...   May 19 2012, 07:19
|- - demiurg_spb   Цитата(Dog Pawlowa @ May 19 2012, 10:19) ...   May 19 2012, 20:32
|- - defunct   Строки наверное удобней выводить printf'ом. fo...   May 21 2012, 00:33
|- - ReAl   Цитата(defunct @ May 21 2012, 03:33) Стро...   May 23 2012, 10:31
- - Alt.F4   ЦитатаДве специальных написать проще и результат н...   May 20 2012, 11:17
- - Alt.F4   Возник новый вопрос. Прочел, что хорошим тоном явл...   May 23 2012, 03:11
|- - Сергей Борщ   QUOTE (Alt.F4 @ May 23 2012, 06:11) Что э...   May 23 2012, 05:48
- - Alt.F4   Сергей Борщ, спасибо большое!!!   May 23 2012, 06:15
- - Alt.F4   Имеем массив в EEPROM и указатель на него: КодEEME...   Jun 2 2012, 15:11
|- - _Артём_   Цитата(Alt.F4 @ Jun 2 2012, 18:11) Имеем ...   Jun 2 2012, 15:27
|- - mempfis_   Цитата(Alt.F4 @ Jun 2 2012, 18:11) Имеем ...   Jun 2 2012, 15:32
- - Alt.F4   Цитатаили так можно: Кодunsigned int addr_EE; addr...   Jun 2 2012, 15:42
|- - _Артём_   Цитата(Alt.F4 @ Jun 2 2012, 18:42) Если д...   Jun 2 2012, 16:02
- - Alt.F4   ЦитатаEEAR = (unsigned short)addr_EE;Варнинг исчез...   Jun 2 2012, 16:06
- - Alt.F4   Delete.   Jun 3 2012, 12:55
- - Alt.F4   Здравствуйте. Столкнулся с новой проблемой, прокля...   Aug 6 2012, 09:58
|- - MrYuran   Цитата(Alt.F4 @ Aug 6 2012, 13:58) Как av...   Aug 6 2012, 11:19
- - aaarrr   Изложите проблему менее абстрактно: что именно нап...   Aug 6 2012, 10:01
- - Alt.F4   aaarrr, ё-мана, это оказывается в Source Files (AV...   Aug 6 2012, 10:14
|- - _Pasha   Цитата(Alt.F4 @ Aug 6 2012, 13:14) ё-мана...   Aug 6 2012, 12:33
|- - maksimp   Цитата(_Pasha @ Aug 6 2012, 16:33) но их ...   Aug 6 2012, 18:45
|- - Сергей Борщ   QUOTE (maksimp @ Aug 6 2012, 21:45) В про...   Aug 6 2012, 19:00
|- - dxp   QUOTE (Сергей Борщ @ Aug 7 2012, 02:00) В...   Aug 7 2012, 03:32
|- - AHTOXA   Цитата(Сергей Борщ @ Aug 7 2012, 01:00) В...   Aug 7 2012, 03:43
- - Alt.F4   Подскажите, пожалуйста, как описать массив структу...   Oct 4 2012, 07:03
|- - MrYuran   Цитата(Alt.F4 @ Oct 4 2012, 11:03) Подска...   Oct 4 2012, 07:23
|- - _Артём_   Цитата(Alt.F4 @ Oct 4 2012, 10:03) Подска...   Oct 4 2012, 08:20
|- - demiurg_spb   Кодtypedef struct { uint8_t code; const uint...   Oct 4 2012, 12:02
- - Alt.F4   MrYuran, компилятор пишет: ../font.h:1362:...   Oct 4 2012, 07:51
|- - MrYuran   Цитата(Alt.F4 @ Oct 4 2012, 11:51) MrYura...   Oct 4 2012, 08:37
- - xemul   Правильно пишет. uint8_t * index uint8_t font_0x31...   Oct 4 2012, 08:20
- - Alt.F4   А как тогда объявить указатель на массив во флэш? ...   Oct 4 2012, 08:28
|- - _Артём_   Цитата(Alt.F4 @ Oct 4 2012, 11:28) з.ы. Р...   Oct 4 2012, 08:41
- - Alt.F4   ЦитатаПравда FontTable тоже во флешь можно размест...   Oct 4 2012, 18:29
|- - _Артём_   Цитата(Alt.F4 @ Oct 4 2012, 21:29) Да, по...   Oct 4 2012, 19:39
|- - demiurg_spb   Цитата(_Артём_ @ Oct 4 2012, 23:39) Не со...   Oct 5 2012, 05:47
|- - _Артём_   Цитата(demiurg_spb @ Oct 5 2012, 08:47) Н...   Oct 5 2012, 14:13
|- - demiurg_spb   Цитата(_Артём_ @ Oct 5 2012, 18:13) Да оп...   Oct 5 2012, 14:18
- - Alt.F4   Цитатаа чтобы читать из флеша или eeprom нужно чер...   Oct 5 2012, 09:47
- - demiurg_spb   Цитата(Alt.F4 @ Oct 5 2012, 13:47) Вроде ...   Oct 5 2012, 10:39
- - demiurg_spb   .   Oct 5 2012, 12:05


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:43
Рейтинг@Mail.ru


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