char[] & MSP430

Feb 02, 2004 Last reply: 22 years ago 11 Replies
úÄÒÁ×ÓÔ×ÕÊ, All!
íÏÖÅÔ ÓÐÒÏÛÕ ÌÁÍÅÒÓËÉÊ ×ÏÐÒÏÓ ÎÏ ÓÁÍ ÏÔ×ÅÔÁ ÐÏËÁ ÎÅ ÎÁÈÏÖÕ :(( ðÏÄÓËÁÖÉÔÅ ËÁË ÇÒÁÍÏÔÎÏ ÎÁ ÑÚÙËÅ ó ÏÒÇÁÎÉÚÏ×ÁÔØ ÂÕÆÆÅÒ ÐÒÉÅÍÁ ÏÔ UART. õ ÍÅÎÑ ÎÁ UART0 ×ÉÓÉÔ ÕÓÔÒÏÊÓÔ×Ï ÏÔ ËÏÔÏÒÏÇÏ Ñ ÄÏÌÖÅÎ ÌÏ×ÉÔØ ÏÔ×ÅÔÙ ÏÔ ×ÙÐÏÌÎÅÎÉÑ áô ÓÏÍÁÎÄ. ÷ ÎÁÞÁÌÅ Ñ ÐÒÉËÉÎÕÌ ÞÔÏ ÐÒÏÝÅ ×ËÁÔÉÔØ ÓÔÒÕËÔÕÒÕ

char input_char[255] unsigned int len_input_char;



void main(void) { ......... }



ðÏ ÐÒÅÒÙ×ÁÎÉÀ ÏÔ UART0 ÍÙ ÄÏÐÉÓÙ×ÁÅÍ ÓÔÒÏËÕ input_char É ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ Õ×ÅÌÉÞÉ×ÁÅÍ ÐÅÒÅÍÅÎÎÕÀ ËÏÌÉÞÅÓÔ×Á ÐÒÉÎÑÔÙÈ ÓÉÍ×ÏÌÏ× len_input_char. á ÚÁÔÅÍ × ÏÓÎÏ×ÎÏÍ ÃÉËÌÅ ÐÒÏÇÒÁÍÍÙ ÚÁÐÒÅÝÁÅÍ ÐÒÅÒÙ×ÁÎÉÑ ÏÔ UART ÁÎÁÌÉÚÉÒÕÅÍ ÞÅÇÏ ÔÁÍ ÎÁÐÒÉÎÉÍÁÌÏÓØ. åÓÌÉ ÔÁÍ ÅÓÔØ _ÐÏÌÎÁÑ_ ÓÔÒÏËÁ ÏËÁÎÞÉ×ÁÀÝÁÑÓÑ ÎÁ /n/r ÔÏ ÅÅ ÏÂÒÁÂÁÔÙ×ÁÅÍ (ÔÉÐÁ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÅÅ ÓÏÄÅÒÖÁÎÉÑ ÉÇÒÁÅÍ ÆÌÁÇÁÍÉ É ÐÒ.) É ÚÁÔÅÍ ÓÄ×ÉÇÁÅÍ ×ÅÓØ ÍÁÓÓÉ× input_char[] × ÌÅ×Ï ÎÁ ÄÌÉÎÕ ÐÒÅÄÛÅÓÔ×ÕÀÝÅÊ ÃÅÌÏÊ ÓÔÒÏËÉ. úÁÔÅÍ ÏÐÑÔØ ×ËÌÀÞÁÅÍ ÐÒÅÒÙ×ÁÎÉÅ É ÏÐÑÔØ ÖÄÅÍ.
÷Ï ×ÓÅÍ ÜÔÏÍ ÍÅÎÑ ÓÍÕÝÁÅÔ ÎÅÓËÏÌØËÏ ÍÏÍÅÎÔÏ×:
1) _ðÏÞÔÉ_ ×ÓÅÇÄÁ ÏÔ×ÅÔ ÕÓÔÒÏÊÓÔ×Á ÍÅÎØÛÅ ÞÅÍ 255 ÓÉÍ×ÏÌÏ× É ÐÏ ÜÔÏÍÕ ÈÏÔÅÌÏÓØ ÂÙ ÏÒÇÁÎÉÚÏ×ÁÔØ ÞÔÏ ÎÉÂÕÄØ ÄÉÎÁÍÉÞÅÓËÏÅ :)) á ÔÏ × ïúõ 430F149 ÎÅ ÏÞÅÎØ ÔÏ ÒÁÚ×ÅÒÎÅÛØÓÑ :((


2) óÄÁÅÔÓÑ ÍÎÅ ÞÔÏ ËÏÇÄÁ × õáòô ÂÕÄÅÔ ÎÅÐÒÅÒÙ×ÎÏ ×ÇÏÎÑÔØÓÑ ÐÏÔÏË Ë ÐÒÉÍÅÒÕ ÉÚ 3 ÓÔÒÏË ÐÏÄÒÑÄ ÒÁÚÄÅÌÅÎÎÙÈ /n/r ÔÏ ÏÓÎÏ×ÎÁÑ ÐÒÏÇÒÁÍÍÁ ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÐÅÒ×ÏÊ ÓÔÒÏËÉ ÏËÁÎÞÉ×ÁÀÝÅÊÓÑ /r/n ÂÒÏÓÉÔÓÑ ÅÅ ÁÎÁÌÉÚÉÒÏ×ÁÔØ (Á ÐÒÉ ÜÔÏÍ ÐÒÅÒÙ×ÁÎÉÑ ÏÔ ÕÁÒÔ ÚÁÐÒÅÝÅÎÙ) É ÐÏÓÌÅÄÕÀÝÉÅ ÓÉÍ×ÏÌÙ ÍÙ ÐÒÏÓÔÏ ÎÅ ÐÒÉÍÅÍ :(( ÷ÒÅÍÑ ÁÎÁÌÉÚÁ ÏÔ×ÅÔÁ ×ÏÏÂÝÅ ÇÏ×ÏÒÑ ÂÕÄÅÔ ÚÎÁÞÉÔÅÌØÎÙÍ. ôÕÔ ÎÁÄÏ ËÁË ÔÏ ÐÒÏÇÒÁÍÎÏ ÏÒÇÁÎÉÚÏ×ÁÔØ 2 ÂÕÆÆÅÒÁ: ÏÄÉÎ ÜÔÏ ÔÏ ÞÔÏ ÍÙ _ÖÅÌÅÚÎÏ_ ÐÒÉÎÉÍÁÅÍ Á ×ÔÏÒÏÊ ÜÔÏ ËÏÐÉÑ ÐÅÒ×ÏÇÏ ÂÕÆÆÅÒÁ ÎÏ ÔÏ ÞÔÏ ÍÏÖÎÏ ÏÂÒÁÂÁÔÙ×ÁÔØ É ÕÒÏÄÏ×ÁÔØ ÐÏ ÓÏÂÓÔ×ÅÎÎÏÍÕ ÖÅÌÁÎÉÀ. ïÐÑÔØ ÖÅ ×ÓÐÌÙ×ÁÅÔ ×ÏÐÒÏÓ Á ËÁË ÜÔÉ ÂÕÆÆÅÒÙ ÍÅÖÄÕ ÓÏÂÏÊ ÓÉÎÈÒÏÎÉÚÉÒÏ×ÁÔØ? ðÒÉ ÜÔÏÍ ïúõ ÏÎÉ ÖÒÁÔØ ÂÕÄÕÔ × 2 ÒÁÚÁ ÂÏÌØÛÅ :((



ëÔÏ ÏÒÇÁÎÉÚÏ×Ù×ÁÌ ÐÏÄÏÂÎÙÅ ×ÅÝÉ ÐÏÄËÉÎØÔÅ ÉÄÅÊËÕ × ËÁËÕÀ ÓÔÏÒÏÎÕ ËÏÐÁÔØ × ÐÏÉÓËÁÈ ÐÒÉÅÍÌÅÍÏÇÏ ÁÌÇÏÒÉÔÍÁ?

P.S. ÷ ÄÏÇÏÎËÕ ÅÝÅ ÏÄÉÎ ÞÁÊÎÉËÏ×ÓËÉÊ ×ÏÐÒÏÓ, ÎÁÞÁÌÏ ÓÏÄÒÁÎÏ Ó ËÁËÏÇÏ ÔÏ ÕÞÅÂÎÉËÁ ÎÏ ÄÏ ËÏÎÃÁ ÎÅ ÄÏÄÅÌÁÎÏ (ËÁË ÐÒÏÓÔÏ ÎÅ ÚÎÁÀ ÅÝÅ ÔÁËÉÈ ×ÅÝÅÊ ÎÅ ÄÅÌÁÌ). èÏÞÕ ÐÒÏÉÚ×ÏÌØÎÙÍ ÐÏÒÑÄËÏÍ ÎÅ ÏÂÒÁÝÁÑÓØ Ë ÉÍÅÎÁÍ ÐÅÒÅÍÅÎÎÙÈ Á ÞÅÒÅÚ ÕËÁÚÁÔÅÌÉ ÉÚÍÅÎÉÔØ ÐÒÏÉÚ×ÏÌØÎÕÀ ÏÂÌÁÓÔØ ïúõ. ÷ ÍÏÅÍ ËÏÎËÒÅÔÎÏÍ ÐÒÉÍÅÒÅ ÐÒÏÓÔÏ ÈÏÞÅÔÓÑ ÐÏÂÁÊÔÎÏ ÓËÏÐÉÒÏ×ÁÔØ ÓÉÍ×ÏÌÙ ÉÚ ÏÄÎÏÇÏ ÍÁÓÓÉ×Á code_text × ÄÒÕÇÏÊ pdu_out ÐÒÅÄ×ÁÒÉÔÅÌØÎÏ ÉÈ ÐÒÏÉÎËÒÅÍÅÎÔÉÒÏ×Á×. ë ÓÏÖÁÌÅÎÉÀ Ñ Ó ÕËÁÚÁÔÅÌÑÍÉ ÔÏÌØËÏ ×ÔÏÒÏÊ ÒÁÚ × ÖÉÚÎÉ ÓÔÁÌËÉ×ÁÀÓØ :((



#include <msp430x14x.h>



char code_text[255]={"hello world"}; char pdu_out[255]; char* p_char1,p_char2;



// Prototipe Functions void pdu_code(char* s1, char* s2);



void main(void){ while (1) { p_char1=&code_text[0]; p_char2=&pdu_out[0]; // ôÕÔ ÉÁÒÏ×ÓËÉÊ ËÏÍÐÉÌÑÔÏÒ ÕÖÅ ÍÁÔÅÒÉÔÓÑ :(( // Error[130]: Incompatible operands of '=' operator // èÏÔÑ ÐÒÅÄÙÄÕÝÕÀ ÓÔÒÏËÕ ÐÒÏÇÌÁÔÙ×ÁÅÔ ÂÅÚ ÐÒÏÂÌÅÍ ? pdu_code(p_char1,p_char1); } // end global while }



void pdu_code(char* s1, char* s2) {char i; for(i=0;i++;i<10){



// ×ÏÔ ÓÄÅÓØ ÈÏÞÅÔÓÑ ×ÚÑÔØ char ÐÏ ÁÄÒÅÓÕ s1+i É ÐÒÏÉÎËÒÅÍÅÎÔÉÒÏ×ÁÔØ // É ÚÁÐÉÓÁÔØ ÅÇÏ ÐÏ ÁÄÒÅÓÕ s2+i .... ......



} }



ó Õ×ÁÖÅÎÉÅÍ, ïÌÅÇ.

... ÷ ÞÅÍ ÚÁËÌÀÞÁÅÔÓÑ ÍÕÌØÔÉÚÁÄÁÞÎÏÓØ WINDOWS? òÁÂÏÔÁÅÔ É ÇÌÀÞÉÔ ÏÄÎÏ×ÒÅÍÅÎÎÏ!


"Oleg Dolgov" <Oleg snipped-for-privacy@p68.f.n5026.z2.fidonet.org> ÓÏÏÂÝÉÌ/ÓÏÏÂÝÉÌÁ × ÎÏ×ÏÓÔÑÈ ÓÌÅÄÕÀÝÅÅ: news:MSGID_2=3A5026=2F49.68 snipped-for-privacy@fidonet.org...

ñ ËÏÎÅÞÎÏ ÐÏÌÎÙÊ ÞÁÊÎÉË, ÎÏ Ñ ÂÙ ÎÁ×ÅÒÎÏÅ ÐÒÏÓÔÏ ÓÄÅÌÁÌ ËÏÎÅÞÎÙÊ Á×ÔÏÍÁÔ, ÒÁÂÏÔÁÀÝÉÊ ÎÁ ËÏÌØÃÅ×ÏÍ ÂÕÆÅÒÅ. íÏÖÅÔ ÜÔÏ É ÞÕÛØ... äÅÎÉÓ.
ðÒÉ×ÅÔ Oleg!

02 Feb 04 12:17, Oleg Dolgov ÐÉÓÁÌ All:

OD> ðÏ ÐÒÅÒÙ×ÁÎÉÀ ÏÔ UART0 ÍÙ ÄÏÐÉÓÙ×ÁÅÍ ÓÔÒÏËÕ input_char É OD> ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ Õ×ÅÌÉÞÉ×ÁÅÍ ÐÅÒÅÍÅÎÎÕÀ ËÏÌÉÞÅÓÔ×Á ÐÒÉÎÑÔÙÈ ÓÉÍ×ÏÌÏ×

[...]

OD> ëÔÏ ÏÒÇÁÎÉÚÏ×Ù×ÁÌ ÐÏÄÏÂÎÙÅ ×ÅÝÉ ÐÏÄËÉÎØÔÅ ÉÄÅÊËÕ × ËÁËÕÀ ÓÔÏÒÏÎÕ OD> ËÏÐÁÔØ × ÐÏÉÓËÁÈ ÐÒÉÅÍÌÅÍÏÇÏ ÁÌÇÏÒÉÔÍÁ?

åÓÌÉ Ñ ÐÒÁ×ÉÌØÎÏ ÐÏÎÑÌ ÚÁÄÁÞÕ, ÔÏ ÞÔÏ-ÔÏ ÔÉÐÁ ÜÔÏÇÏ:

char input_buffer[256]; char* putptr = input_buffer; char* getptr = input_buffer; volatile int depth = 0;

void putchar(char c) /* ×ÙÚÙ×ÁÅÔÓÑ ÉÚ ÐÒÅÒÙ×ÁÎÉÑ */ { if(depth == 256) return; /* ÂÕÆÅÒ ÐÅÒÅÐÏÌÎÅÎ */

*putptr++ = c; depth++; if(putptr == input_buffer + sizeof(input_buffer)) putptr = input_buffer; }

int getchar(void) { char c; while(depth == 0); /* ÂÕÆÅÒ ÐÕÓÔ */ depth--; c = *getptr++; if(getptr == input_buffer + sizeof(input_buffer)) getptr = input_buffer; return c; }

÷ÎÕÔÒÉ main() ÐÒÉÎÉÍÁÊ ÓÉÍ×ÏÌÙ × ÂÕÆÅÒ ÓÔÒÏËÉ ÞÅÒÅÚ getchar(). ÷ÓÅÇÏ ÎÁÉÌÕÞÛÅÇÏ, [Team PCAD 2000] áÌÅËÓÅÊ í. ... óÏ×ÅÔ ÄÎÑ: ÞÔÏÂÙ ÕÂÉÔØ ÖÉÒÎÕÀ ÌÏÛÁÄØ, ÄÏÂÁרÔÅ Ë ËÁÐÌÅ ÎÉËÏÔÉÎÁ ËÁÐÌÀ fairy

Hello Alex.

Mon Feb 02 2004 20:09, Alex Mogilnikov wrote to Oleg Dolgov:

AM> if(putptr == input_buffer + sizeof(input_buffer)) AM> putptr = input_buffer;

á ÐÒÏ ÏÐÅÒÁÃÉÀ ×ÚÑÔÉÑ ÍÏÄÕÌÑ ÎÅ ÓÌÙÛÁÌ? :) ñ ÐÒÉÍÅÒÎÏ ÜÔÏ ÄÅÌÁÌ ÐÒÉÍÅÒÎÏ ÔÁË; ÓÔÉÌØ, ÅÓÔÅÓÔ×ÅÎÎÏ, ÐÁÓËÁÌÅ×ÓËÉÊ. ;)

#define QBUF_SIZE 16 #define QBUF_SIZE_IS_POWER_OF_TWO 1 //set to 0 if QBUF_SIZE ISN'T a power of two typedef byte qbuf [QBUF_SIZE];

class Ring {

public: Ring (); bool Empty (void); bool Full (void); bool Put (byte data); byte Get (void);

private: void Inc (byte & Idx); byte Next (byte x);

byte Head, Tail; qbuf Buf; };

Ring::Ring () { Head = 0; Tail = 0; }

byte Ring::Next (byte x) { #if QBUF_SIZE_IS_POWER_OF_TWO return (x+1) & (QBUF_SIZE-1); #else return (x+1) % QBUF_SIZE; #endif }

void Ring::Inc (byte & Idx) { Idx = Next(Idx); }

bool Ring::Empty (void) { return (Head == Tail); }

bool Ring::Full (void) { return (Next(Tail) == Head); }

bool Ring::Put (byte data) { if (Full()) return FALSE;

Buf[Tail] = data; Inc(Tail); return TRUE; }

byte Ring::Get (void) { byte result; //--------- if (Empty()) return 0;

result = Buf[Head]; Inc(Head); return result; }

Dimmy.

ðÒÉ×ÅÔ Dimmy!

04 Feb 04 07:38, Dimmy Timchenko ÐÉÓÁÌ Alex Mogilnikov:

AM>> if(putptr == input_buffer + sizeof(input_buffer)) AM>> putptr = input_buffer;

DT> á ÐÒÏ ÏÐÅÒÁÃÉÀ ×ÚÑÔÉÑ ÍÏÄÕÌÑ ÎÅ ÓÌÙÛÁÌ? :) ñ ÐÒÉÍÅÒÎÏ ÜÔÏ ÄÅÌÁÌ DT> ÐÒÉÍÅÒÎÏ ÔÁË; ÓÔÉÌØ, ÅÓÔÅÓÔ×ÅÎÎÏ, ÐÁÓËÁÌÅ×ÓËÉÊ. ;)

ñ ËÁË-ÔÏ ÉÓÔÏÒÉÞÅÓËÉ ÐÒÉ×ÙË ÈÒÁÎÉÔØ ÉÍÅÎÎÏ ÁÄÒÅÓÁ, Á ÎÅ ÉÎÄÅËÓÙ. é ÇÌÕÂÉÎÕ ÚÁÐÏÌÎÅÎÉÑ × ÏÔÄÅÌØÎÏÊ ÐÅÒÅÍÅÎÎÏÊ Ñ ÔÏÖÅ ÎÅ ÈÒÁÎÀ, Á ×ÙÞÉÓÌÑÀ ÅÅ ÎÁ ÈÏÄÕ, ËÁË É Õ ÔÅÂÑ ÎÁÐÉÓÁÎÏ. ÷ ÔÁËÏÍ ×ÉÄÅ ÐÒÉ×ÅÌ ÌÉÛØ ËÁË ÐÒÉÍÅÒ... ÷ÓÅÇÏ ÎÁÉÌÕÞÛÅÇÏ, [Team PCAD 2000] áÌÅËÓÅÊ í. ... ðÉÒÏÖÏË ÓÙÒÏÊ Ó ÓÙÒÏÍ.
4-Feb-04 07:38 Dimmy Timchenko wrote to Alex Mogilnikov:

AM>> if(putptr == input_buffer + sizeof(input_buffer)) AM>> putptr = input_buffer;

DT> А про операцию взятия модуля не слышал? :) Я примерно это делал примерно DT> так; стиль, естественно, паскалевский. ;)

DT> #define QBUF_SIZE 16 DT> #define QBUF_SIZE_IS_POWER_OF_TWO 1 //set to 0 if QBUF_SIZE ISN'T a

Чтобы не полагаться на чтение комментариев - вместо второй строки

#if (QBUF_SIZE) & (QBUF_SIZE-1) #define QBUF_SIZE_IS_POWER_OF_TWO 0 #else #define QBUF_SIZE_IS_POWER_OF_TWO 1 #endif

DT> { DT> #if QBUF_SIZE_IS_POWER_OF_TWO DT> return (x+1) & (QBUF_SIZE-1); Это нормально.

DT> #else DT> return (x+1) % QBUF_SIZE; Это очень долго на всех, пожалуй, 8-битках и на очень многих 16-битках. На которых не очень долго - почти наверняка просто долго.

Ну и индексы вместо указателей хоть и могут сэкономить ОЗУ (если они 8-битные а указатели уже нужны 16-битные), но код и время выполнения увеличат.

wbr,

Hello Oleksandr.

Thu Feb 05 2004 20:56, Oleksandr Redchuk wrote to me:

OR> þÔÏÂÙ ÎÅ ÐÏÌÁÇÁÔØÓÑ ÎÁ ÞÔÅÎÉÅ ËÏÍÍÅÎÔÁÒÉÅ× - ×ÍÅÓÔÏ ×ÔÏÒÏÊ ÓÔÒÏËÉ

OR> #if (QBUF_SIZE) & (QBUF_SIZE-1) OR> #define QBUF_SIZE_IS_POWER_OF_TWO 0 OR> #else OR> #define QBUF_SIZE_IS_POWER_OF_TWO 1 OR> #endif

ï! ñ ÄÏÌÇÏ ÄÕÍÁÌ - Á ËÁË ÖÅ ÜÔÏ ÓÄÅÌÁÔØ? ÷ ÓÁÍÏÍ ÄÅÌÅ. :) öÁÌØ, ÞÔÏ ÍÁÔÅÍÁÔÉËÕ ÐÌÏÈÏ ÚÎÁÀ.

DT>> { DT>> #if QBUF_SIZE_IS_POWER_OF_TWO DT>> return (x+1) & (QBUF_SIZE-1); OR> üÔÏ ÎÏÒÍÁÌØÎÏ.

DT>> #else DT>> return (x+1) % QBUF_SIZE; OR> üÔÏ ÏÞÅÎØ ÄÏÌÇÏ ÎÁ ×ÓÅÈ, ÐÏÖÁÌÕÊ, 8-ÂÉÔËÁÈ É ÎÁ ÏÞÅÎØ ÍÎÏÇÉÈ 16-ÂÉÔËÁÈ.

åÓÌÉ ÄÅÌÅÎÉÑ ÎÅÔ...

HÕ ÔÁË ÐÏÜÔÏÍÕ ÓÌÅÄÕÅÔ ÄÅÌÁÔØ ÂÕÆÅÒ, ËÒÁÔÎÙÊ ÓÔÅÐÅÎÉ Ä×ÏÊËÉ. ëÓÔÁÔÉ, Ñ ÐÏÐÒÏÂÏ×ÁÌ ÎÁÐÉÓÁÔØ ÐÒÏÓÔÏ ×ÔÏÒÏÊ ×ÁÒÉÁÎÔ, ÎÁÄÅÑÓØ, ÞÔÏ IAR ÓÏÐÔÉÍÉÚÉÒÕÅÔ. æÉÇÕÛËÉ! ÷ÙÚ×ÁÌ ÐÒÏÃÅÄÕÒÕ ×ÙÞÉÓÌÅÎÉÑ ÏÓÔÁÔËÁ.

OR> HÕ É ÉÎÄÅËÓÙ ×ÍÅÓÔÏ ÕËÁÚÁÔÅÌÅÊ ÈÏÔØ É ÍÏÇÕÔ ÓÜËÏÎÏÍÉÔØ ïúõ OR> (ÅÓÌÉ ÏÎÉ 8-ÂÉÔÎÙÅ Á ÕËÁÚÁÔÅÌÉ ÕÖÅ ÎÕÖÎÙ 16-ÂÉÔÎÙÅ), ÎÏ ËÏÄ É ×ÒÅÍÑ OR> ×ÙÐÏÌÎÅÎÉÑ Õ×ÅÌÉÞÁÔ.

äÌÑ ÍÅÎÑ ×ÁÖÎÅÅ ÎÁģÖÎÏÓÔØ, ÂÅÚÏÐÁÓÎÏÓÔØ É ÞÉÔÁÅÍÏÓÔØ (ËÏÔÏÒÁÑ ÔÏÖÅ ÏÂÙÞÎÏ ÎÁģÖÎÏÓÔÉ ÐÒÉÂÁ×ÌÑÅÔ). óÏÇÌÁÓÉÓØ, ÞÔÏ ÉÎÄÅËÓÉÒÏ×ÁÎÉÅ ÍÁÓÓÉ×Á - ÂÏÌÅÅ "ÐÒÏÚÒÁÞÎÁÑ" ÏÐÅÒÁÃÉÑ. á ËÏÍÐÁËÎÏÓÔØ ËÏÄÁ É ÂÙÓÔÒÏÄÅÊÓÔ×ÉÅ - ÔÏÌØËÏ ÅÓÌÉ "ÎÅ ×ÌÁÚÉÔ". äÁ É ÐÒÏ×ÅÒËÁ ÎÁ ÐÅÒÅÐÏÌÎÅÎÉÅ Ó ÕËÁÚÁÔÅÌÑÍÉ ÐÏÌÕÞÁÅÔÓÑ ÎÅËÒÁÓÉ×ÏÊ.

Dimmy.

"Dimmy Timchenko" <Dimmy snipped-for-privacy@f15.n.z2.fidonet.org> ÓÏÏÂÝÉÌ/ÓÏÏÂÝÉÌÁ × ÎÏ×ÏÓÔÑÈ ÓÌÅÄÕÀÝÅÅ: news:MSGID_2=3A469=2F15 snipped-for-privacy@fidonet.org...

ÍÏÖÎÏ ËÓÔÁÔÉ ÎÅ ÚÁÍÏÒÁÞÉ×ÁÔØÓÑ ÕÓÌÏ×ÎÏÊ ËÏÍÐÉÌÑÃÉÅÊ. éáò 2.28 ÎÏÒÍÁÌØÎÏ ÔÕÔ ÓÏÏÂÒÁÖÁÅÔ. ×ÏÔ ËÏÄ ×Ï ÞÔÏ Õ ÍÅÎÑ ÓÏÂÉÒÁÅÔÓÑ: 29 if(((U8)(uart_sq.tail + 1) % UART_Q_SIZE) == uart_sq.head) return -1; \ 00000002 .... LDI R30,uart_sq \ 00000004 8511 LDD R17,Z+9 \ 00000006 9513 INC R17 \ 00000008 7017 ANDI R17,0x07 \ 0000000A 8520 LDD R18,Z+8 \ 0000000C 1712 CP R17,R18 \ 0000000E F411 BRNE ??uart_put_0 \ 00000010 EF0F LDI R16,255 \ 00000012 C00A RJMP ??uart_put_1

HÏ Ñ ÐÒÁ×ÄÁ ÐÒÏ×ÏÖÕ ÒÅÚÕÌØÔÁÔ ÓÌÏÖÅÎÉÑ Ë 8 ÂÉÔÁÍ (ÐÏ ÕÍÏÌÞÁÎÉÀ ÏÎ 16 ÂÉÔ É ÔÏÇÄÁ ÏÎ ÍÏÖÅÔ ÎÁ×ÒÎÏÅ ÚÁÎÑÔØÓÑ ÄÅÌÅÎÉÅÍ).

äÅÎÉÓ.
6-Feb-04 08:39 Dimmy Timchenko wrote to Oleksandr Redchuk:

DT>>> return (x+1) % QBUF_SIZE; OR>> Это очень долго на всех, пожалуй, 8-битках и на очень многих 16-битках.

DT> Если деления нет... Ну вот я и очертил -- где его нет или оно очень медленное по сравнению с остальными действиями.

OR>> Hу и индексы вместо указателей хоть и могут сэкономить ОЗУ OR>> (если они 8-битные а указатели уже нужны 16-битные), но код и время OR>> выполнения увеличат.

DT> Для меня важнее надёжность, безопасность и читаемость (которая тоже DT> обычно DT> надёжности прибавляет). Согласись, что индексирование массива - более DT> "прозрачная" операция. После паскаля. А после ассемблера - ещё вопрос. В стандарте С специально гарантируется, что указатель сразу за концом массива - валиден для операций сравнения и адресной арифметики (но не для обращения). Чтобы можно было делать out = *outptr++; if ( outptr >= buffer+BUFSIZE ) outptr = buffer; а не out = *outptr; if ( outptr == buffer+BUFSIZE-1) outptr = buffer; else ++outptr;

Там, правда, возникает один философский вопрос, но в реальных системах он как-то решается

DT> Да и проверка на переполнение с указателями получается некрасивой. Чем же?

wbr,

Hello dennis.

Fri Feb 06 2004 20:47, Dennis Opanasenko wrote to All:

DO> ÍÏÖÎÏ ËÓÔÁÔÉ ÎÅ ÚÁÍÏÒÁÞÉ×ÁÔØÓÑ ÕÓÌÏ×ÎÏÊ ËÏÍÐÉÌÑÃÉÅÊ. éáò 2.28 ÎÏÒÍÁÌØÎÏ DO> ÔÕÔÓÏÏÂÒÁÖÁÅÔ. ×ÏÔ ËÏÄ ×Ï ÞÔÏ Õ ÍÅÎÑ ÓÏÂÉÒÁÅÔÓÑ:

DO> if(((U8)(uart_sq.tail + 1) % UART_Q_SIZE) == uart_sq.head) return -1;

á! HÕ ÔÁË ÜÔÏ ÖÅ ÎÁÄÏ ÂÙÌÏ ÓÏÏÂÒÁÚÉÔØ, ÞÔÏ ÒÅÚÕÌØÔÁÔ ÓÌÏÖÅÎÉÑ ÂÁÊÔÁ Ó ËÏÎÓÔÁÎÔÏÊ ÂÕÄÅÔ ÔÉÐÁ int. ;)

Dimmy.

7-Feb-04 15:29 Dimmy Timchenko wrote to snipped-for-privacy@adres.v.pisme:

DO>> можно кстати не заморачиваться условной компиляцией. ИАР 2.28 нормально DO>> тутсоображает. вот код во что у меня собирается:

DO>> if(((U8)(uart_sq.tail + 1) % UART_Q_SIZE) == uart_sq.head) return -1;

DT> А! Hу так это же надо было сообразить, что результат сложения байта с DT> константой будет типа int. ;) Ничего соображать не надо. Integer promotion rules - прочесть один раз и запомнить.

Некоторые эхотажные компиляторы достаточно хорошо оптимизируют, чтобы соптимизировать эти правила, некотоыре имеют ключик для их отключения. У некоторых остаются недооптимизированные хвосты.

В данном случае компилятор самовольничать не имел права, так как по этим правилам при .tail = 255 результат выражения

uart_sq.tail + 1

будет равен 256, а

256 % UART_Q_SIZE

отнюдь не обязано быть равно

0 % UART_Q_SIZE

Поскольку он ничего не знает о том, в каких пределах реально меняется .tail -- он не мог знать, что .tail + 1 всегда меньше 256 и можно уоптимизировать до работы с U8.

wbr,

ðÒÉ×ÅÔ Kirill!

21 Feb 04 17:31, Kirill Frolov ÐÉÓÁÌ Oleksandr Redchuk:

OR>> ÓÐÅÃÉÁÌØÎÏ ÇÁÒÁÎÔÉÒÕÅÔÓÑ, ÞÔÏ ÕËÁÚÁÔÅÌØ ÓÒÁÚÕ ÚÁ ËÏÎÃÏÍ ÍÁÓÓÉ×Á - OR>> ×ÁÌÉÄÅÎ ÄÌÑ ÏÐÅÒÁÃÉÊ ÓÒÁ×ÎÅÎÉÑ É ÁÄÒÅÓÎÏÊ ÁÒÉÆÍÅÔÉËÉ (ÎÏ ÎÅ ÄÌÑ OR>> ÏÂÒÁÝÅÎÉÑ).

KF> äÌÑ 16-ÒÁÚÒÑÄÎÏÇÏ AVR: char *p = 0xffff; ÷ÏÐÒÏÓ: ÞÅÍ ÂÕÄÅ ÒÁ×ÅÎ KF> &p[1], ÅÓÌÉ ÕËÁÚÁÔÅÌØ ÚÁ ÐÒÅÄÅÌÁÍÉ ÍÁÓÓÉ×Á "×ÁÌÉÄÅÎ"? á ×ÅÄØ 0 KF> ÐÏÌÕÞÁÅÔÓÑ...

áÄÒÅÓ 0 ×ÁÌÉÄÅÎ ÄÌÑ ÏÐÅÒÁÃÉÊ ÓÒÁ×ÎÅÎÉÑ É ÁÒÉÆÍÅÔÉËÉ.

OR>> þÔÏÂÙ ÍÏÖÎÏ ÂÙÌÏ ÄÅÌÁÔØ

KF> ÷ÏÔ ÚÄÅÓØ char *outptr=0xffff;

OR>> out = *outptr++; OR>> if ( outptr >= buffer+BUFSIZE )

KF> é ÄÁÌØÛÅ ÐÏÌÎÁÑ ÅÒÕÎÄÁ ÐÏÌÕÞÁÅÔÓÑ...

ðÏÔÏÍÕ ÞÔÏ × ÜÔÏÍ ËÏÎËÒÅÔÎÏÍ ÓÌÕÞÁÅ ÐÒÁ×ÉÌØÎÅÅ ÐÉÓÁÔØ outptr == buffer+BUFSIZE.

DT>>> äÁ É ÐÒÏ×ÅÒËÁ ÎÁ ÐÅÒÅÐÏÌÎÅÎÉÅ Ó ÕËÁÚÁÔÅÌÑÍÉ ÐÏÌÕÞÁÅÔÓÑ DT>>> ÎÅËÒÁÓÉ×ÏÊ. OR>> þÅÍ ÖÅ?

KF> å£ ÏÔÓÕÔÓÔ×ÉÅÍ. ñ ÔÁË ÐÏÎÉÍÁÀ, ÐÒÉÎÑÔÏ ÎÁ NULL ÎÅ ÎÁÓÔÕÐÁÔØ...

åÄÉÎÓÔ×ÅÎÎÏÅ, ÞÔÏ ÎÅÌØÚÑ ÄÅÌÁÔØ Ó NULL - ÜÔÏ ÏÂÒÁÝÁÔØÓÑ ÐÏ ÎÅÍÕ. :) ÷ÓÅÇÏ ÎÁÉÌÕÞÛÅÇÏ, [Team PCAD 2000] áÌÅËÓÅÊ í. ... ñ ÕÄÁÌÀ Ô×ÏÀ ÖÁÖÄÕ. âÅÚ ×ÏÚÍÏÖÎÏÓÔÉ ×ÏÓÓÔÁÎÏ×ÌÅÎÉÑ.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required