-
11. Data: 2017-10-19 22:28:13
Temat: Re: Definiowane portów/flag w C
Od: Sebastian Biały <h...@p...onet.pl>
On 10/19/2017 10:17 PM, sword wrote:
>> Z powodu jakiego? Technicznego czy białkowego?
> Jest narzucone z "góry".
Czyli białkowy. Nadzieja w tym że problemy białkowe czasami rozwiązują
się szybciej niż komercyjne kompilatory dostają wsparcie C++, ale to
rodzaj czarnego humoru.
To nie pomogę bo każde rozwiązanie w C będzie gówniane.
-
12. Data: 2017-10-19 22:48:08
Temat: Re: Definiowane portów/flag w C
Od: Jakub Rakus <s...@o...pl>
W dniu 19.10.2017 o 13:01, sword pisze:
> 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.
Problem moim zdaniem nie leży ani w wybranym w języku programowania, ani
w sposobie implementacji tylko "wyżej" - zagadnienie nazywa się semantyka.
Rozwiązanie banalne - stosuj nazwy zmiennych, funkcji, makr i definicji,
które będą JEDNOZNACZNE i SAMOKOMENTUJĄCE SIĘ. Dobrym przykładem mogą
być biblioteki dostarczane przez ST do ich procków, bo tam przyjęto
regułę, że jeśli rejestr nazywa się REG_BLA_BLA to bity w nim nazywają
się REG_BLA_BLA_ENABLE_COŚTAM, REG_BLA_BLA_DISABLE_INNE_COŚTAM itd.
--
Pozdrawiam
Jakub Rakus
-
13. Data: 2017-10-20 02:04:54
Temat: Re: Definiowane portów/flag w C
Od: "J.F." <j...@p...onet.pl>
Dnia Thu, 19 Oct 2017 21:38:58 +0200, Grzegorz Niemirowski napisał(a):
> 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.
[...]
A na bezczelnego ?
#define F_LED GPIO,7
... setbit(F_LED) ...
https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.
html
J.
-
14. Data: 2017-10-20 09:43:05
Temat: Re: Definiowane portów/flag w C
Od: Marcin <m...@o...pl>
> A na bezczelnego ?
>
> #define F_LED GPIO,7
>
> ... setbit(F_LED) ...
>
> https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.
html
>
Do takiego zadzialania potrzeba "podwojnego makra":
#define _test_set_bit(port,pin) do{ (port)->PDOR |=(1<<(pin)); }while(0)
#define test_set_bit(x) _test_set_bit(x)
#define LEG_G_7 GPIOB,7
i wtedy
test_set_bit(LEG_G_7);
preprocesor rozwinie poprawnie:
do{ (((GPIO_Type *)(0x400FF040u)))->PDOR |=(1<<(7)); }while(0);
Przy pojedynczym makro (jak pierwsze) arm-none-eabi-gcc zglasza blad ze makro ma miec
2 parametry a przekazany jest tylko 1.
$ arm-none-eabi-gcc -E -mcpu=cortex-m0plus makro.c -o makro2.lst
makro.c:14:23: error: macro "test_set_bit" requires 2 arguments, but only 1 given
test_set_bit(LEG_G_7);
Marcin
-
15. Data: 2017-10-20 11:53:52
Temat: Re: Definiowane portów/flag w C
Od: Janusz <j...@o...pl>
W dniu 2017-10-19 o 13:01, sword pisze:
>
> 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.:
Ja to robię tak wpierw definicje makr
#define SET_(p, m) (p |= (1 << (m)))
#define CLR_(p, m) (p &= ~(1 << (m)))
#define TEST_(p,m) (p & (1 << (m)))
#define TOGGLE_(p, m) (p ^= (1 << (m)))
#define SET(x) SET_(x)
#define CLR(x) CLR_(x)
#define TEST(x) TEST_(x)
#define TOGGLE(x) TOGGLE_(x)
potem właściwa konfiguracja
#define ZIELONA PORTB,1
i potem w programie
SET(ZIELONA);
--
Pozdr
Janusz
-
16. Data: 2017-10-20 13:57:16
Temat: Re: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
On 2017-10-19 21:38, Grzegorz Niemirowski wrote:
> Musisz stworzyć coś, co oprócz bitu będzie nisło też
> informację o porcie, np.
Fajny przykład ale do pracy z bitami to za dużo kodu.
--
sword
-
17. Data: 2017-10-20 14:21:16
Temat: Re: Definiowane portów/flag w C
Od: sword <n...@p...onet.pl>
On 2017-10-20 11:53, Janusz wrote:
> Ja to robię tak wpierw definicje makr
Dzięki, o to mi chodziło :)
--
sword
-
18. Data: 2017-10-20 15:17:15
Temat: Re: Definiowane portów/flag w C
Od: g...@s...invalid (Adam Wysocki)
sword <n...@p...onet.pl> wrote:
> Hmm, mogę dać inline ale wydaje mi się, że jestem w tym samym
> punkcie co z makrami.
Niekoniecznie.
> static inline void setbit (u8 port, u8 pin)
Nie wiem na jaką platformę piszesz, ale na AVR port nie ma typu u8
(uint8).
> No i co dalej? Chciałbym ją tak samo wywołać, np.:
>
> setbit(F_LED)
Spróbuj tak:
[gof@pi /tmp]$ cat test.c
#include <inttypes.h>
#include <avr/io.h>
// bez nawiasów, żeby nie rozwinęło się tylko do jednego argumentu
#define MAKE(port, bit) &port, _BV(bit)
// podejście z MAKE
#define LED1 MAKE(PORTB, 3)
#define BUZZER1 MAKE(PORTC, 0)
// podejście bez MAKE - bez nawiasów!
#define LED2 &PORTB, _BV(3)
#define BUZZER2 &PORTC, _BV(0)
static inline void setbit(volatile uint8_t *port, uint8_t mask)
{
*port |= mask;
}
int main(void)
{
setbit(LED1);
setbit(BUZZER1);
setbit(LED2);
setbit(BUZZER2);
return 0;
}
[gof@pi /tmp]$ avr-gcc -mmcu=atmega8 -Wall -Wextra test.c
[gof@pi /tmp]$
--
[ Email: a@b a=grp b=chmurka.net ]
[ Web: http://www.chmurka.net/ ]