-
1. Data: 2017-10-19 13:01:49
Temat: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
Cześć,
Może nie do końca ta grupa ale wielu z Was pisze w C i może mi podpowie :)
Korzystam z takich makr, które pracują na bitach, np.:
#define setbit(VAR,Place) ( (VAR) |= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) )
w programie mam zdefiniowane np.:
#define PORT_LED GPIOA
#define LED_R 0
uint8_t main_flags1, main_flags2, main_flags3;
#define FLAGA1 0
#define FLAGA2 0
i później takie wykorzystanie np.:
setbit(PORT_LED, LED_R);
setbit(main_flags, FLAGA1);
setbit(main_flags2, FLAGA2);
Przy portach to jeszcze nie jest problemu ale przy flagach trzeba
ręcznie panować nad tym w której zmiennej leży jaka flaga. Już
kilka razy szukałem przez to błędów.
Jak zrobić, żeby odwołanie do flagi było jednoznaczne, chodziło by mi
o coś takiego (co nie działa przez ten przecinek):
#define F_LED_R PORT_LED,LED_R
setbit(F_LED_R);
Wtedy w programie nie muszę się już zastanawiać gdzie leży jaki bit.
Zawsze tak pisałem w asm, a teraz mi tego brakuje :)
Pozdrawiam,
--
sword
-
2. Data: 2017-10-19 13:47:30
Temat: Re: Definiowane portów/flag w C
Od: g...@s...invalid (Adam Wysocki)
sword <n...@p...onet.pl> wrote:
> Jak zrobić, żeby odwołanie do flagi było jednoznaczne, chodziło by mi
> o coś takiego (co nie działa przez ten przecinek):
>
> #define F_LED_R PORT_LED,LED_R
>
> setbit(F_LED_R);
#define led_set() set_bit(PORT_LED, LED_R)
--
[ Email: a@b a=grp b=chmurka.net ]
[ Web: http://www.chmurka.net/ ]
-
3. Data: 2017-10-19 14:15:54
Temat: Re: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
On 2017-10-19 13:47, Adam Wysocki wrote:
> sword <n...@p...onet.pl> wrote:
>
>> Jak zrobić, żeby odwołanie do flagi było jednoznaczne, chodziło by mi
>> o coś takiego (co nie działa przez ten przecinek):
>>
>> #define F_LED_R PORT_LED,LED_R
>>
>> setbit(F_LED_R);
>
> #define led_set() set_bit(PORT_LED, LED_R)
Ja tych makr mam więcej, to był tylko przykład z 'setbit'.
Chodzi o to, żeby w dowolnym makrze można było podstawić port
lub flagę nie generując przy tym osobnego makra dla każdego
przypadku, np.:
setbit(F_LED_R);
clrbit(F_LED_R);
chgbit(F_LED_R);
if (valbit(F_LED_R))
--
sword
-
4. Data: 2017-10-19 14:30:25
Temat: Re: Definiowane portów/flag w C
Od: Waldemar <w...@z...fu-berlin.de>
Am 19.10.2017 um 14:15 schrieb sword:
> On 2017-10-19 13:47, Adam Wysocki wrote:
>> sword <n...@p...onet.pl> wrote:
>>
>>> Jak zrobić, żeby odwołanie do flagi było jednoznaczne, chodziło by mi
>>> o coś takiego (co nie działa przez ten przecinek):
>>>
>>> #define F_LED_R PORT_LED,LED_R
>>>
>>> setbit(F_LED_R);
>>
>> #define led_set() set_bit(PORT_LED, LED_R)
>
> Ja tych makr mam więcej, to był tylko przykład z 'setbit'.
> Chodzi o to, żeby w dowolnym makrze można było podstawić port
> lub flagę nie generując przy tym osobnego makra dla każdego
> przypadku, np.:
>
> setbit(F_LED_R);
> clrbit(F_LED_R);
> chgbit(F_LED_R);
> if (valbit(F_LED_R))
a czemu upierasz się przy makrach? Nie możesz dać inline function?
Waldek
-
5. Data: 2017-10-19 20:17:48
Temat: Re: Definiowane portów/flag w C
Od: Sebastian Biały <h...@p...onet.pl>
On 10/19/2017 1:01 PM, sword wrote:
> Wtedy w programie nie muszę się już zastanawiać gdzie leży jaki bit.
Nie musisz jesli użyjesz C++. Nie mam stosownego przykładu pod reką w
tej chwili ale kilka lat temu mając ochote ukręcić leb idiotom od
definicji rejestrow SAM7 narzeźbilem coś takiego i "sprzedałem" kod.
Napisanie tego na nowo jest w zasadzie osiągalne.
Oczywiście od razu informacja dla wszystkich co podskoczyli na hasło C++
- ten mechanizm nie genaruje ani bajta więcej w kodzie. To
metaprogramowanie na szablonach, operatorach itd, na końcu wychodzi to
samo tylko pewne i bez głupich pomyłek i wygląda prawie identycznie.
-
6. Data: 2017-10-19 21:14:07
Temat: Re: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
On 2017-10-19 14:30, Waldemar wrote:
>> Ja tych makr mam więcej, to był tylko przykład z 'setbit'.
>> Chodzi o to, żeby w dowolnym makrze można było podstawić port
>> lub flagę nie generując przy tym osobnego makra dla każdego
>> przypadku, np.:
>>
>> setbit(F_LED_R);
>> clrbit(F_LED_R);
>> chgbit(F_LED_R);
>> if (valbit(F_LED_R))
>
> a czemu upierasz się przy makrach? Nie możesz dać inline
> function?
Hmm, mogę dać inline ale wydaje mi się, że jestem w tym samym
punkcie co z makrami.
static inline void setbit (u8 port, u8 pin)
{
port |= 1<<pin;
}
No i co dalej? Chciałbym ją tak samo wywołać, np.:
setbit(F_LED)
--
sword
-
7. Data: 2017-10-19 21:15:46
Temat: Re: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
On 2017-10-19 20:17, Sebastian Biały wrote:
> On 10/19/2017 1:01 PM, sword wrote:
>> Wtedy w programie nie muszę się już zastanawiać gdzie leży
>> jaki bit.
>
> Nie musisz jesli użyjesz C++. Nie mam stosownego przykładu
> pod reką w tej chwili ale kilka lat temu mając ochote
> ukręcić leb idiotom od definicji rejestrow SAM7 narzeźbilem
> coś takiego i "sprzedałem" kod. Napisanie tego na nowo jest
> w zasadzie osiągalne.
>
> Oczywiście od razu informacja dla wszystkich co podskoczyli
> na hasło C++ - ten mechanizm nie genaruje ani bajta więcej w
> kodzie. To metaprogramowanie na szablonach, operatorach itd,
> na końcu wychodzi to samo tylko pewne i bez głupich pomyłek
> i wygląda prawie identycznie.
Ja mam C na sztywno w tym projekcie i nie dam rady przeskoczyć
na C++.
--
sword
-
8. Data: 2017-10-19 21:19:39
Temat: Re: Definiowane portów/flag w C
Od: Sebastian Biały <h...@p...onet.pl>
On 10/19/2017 9:15 PM, sword wrote:
> Ja mam C na sztywno w tym projekcie i nie dam rady przeskoczyć
> na C++.
Z powodu jakiego? Technicznego czy białkowego?
-
9. Data: 2017-10-19 21:38:58
Temat: Re: Definiowane portów/flag w C
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
sword <n...@p...onet.pl> napisał(a):
> Hmm, mogę dać inline ale wydaje mi się, że jestem w tym samym
> punkcie co z makrami.
> static inline void setbit (u8 port, u8 pin)
> {
> port |= 1<<pin;
> }
> No i co dalej? Chciałbym ją tak samo wywołać, np.:
> setbit(F_LED)
Musisz stworzyć coś, co oprócz bitu będzie nisło też informację o porcie,
np.
#include <stdio.h>
#define PINA1 0x01
#define PINA2 0x02
#define PINB2 0x02
#define PINB3 0x03
#define F_PINA1 (0x0000 | PINA1)
#define F_PINA2 (0x0000 | PINA2)
#define F_PINB2 (0x0100 | PINB2)
#define F_PINB3 (0x0100 | PINB3)
int porta = 0, portb = 0;
void setpin(unsigned int fpin);
int main() {
setpin(F_PINA1);
setpin(F_PINA2);
setpin(F_PINB2);
setpin(F_PINB3);
printf("%x %x\n", porta, portb);
return 0;
}
void setpin(unsigned int fpin){
int port = fpin >> 8;
int pin = 0x00ff & fpin;
switch(port) {
case 0x00:
porta |= 1 << pin;
break;
case 0x01:
portb |= 1 << pin;
break;
}
}
--
Grzegorz Niemirowski
http://www.grzegorz.net/
-
10. Data: 2017-10-19 22:17:29
Temat: Re: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
On 2017-10-19 21:19, Sebastian Biały wrote:
> On 10/19/2017 9:15 PM, sword wrote:
>> Ja mam C na sztywno w tym projekcie i nie dam rady
>> przeskoczyć
>> na C++.
>
> Z powodu jakiego? Technicznego czy białkowego?
Jest narzucone z "góry".
--
sword