Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

слева есть плюс и минус.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Вопросы по С/С++ (СИ)

Сообщение Мурик »

[uquote="Billi34",url="/forum/viewtopic.php?p=3692332#p3692332"]Помогите в синтаксисе этого компилятора[/uquote]На картинке немного странный код.

Код: Выделить всё

         while(!PIND.B1)i=0;i<50;//пока Д1 ноль сч считает и в случае переполнения
            {
                Delay_ms(10);i++;//выходит  на начало иначе далее по программе
               }
                 goto mesto_1
Цикл while в данном случае ограничивается точкой с запятой, т. е.

Код: Выделить всё

while(!PIND.B1)i=0;
Зачем часть кода вынесена в фигурные скобки непонятно. К циклу они отношения не имеют, а путаницу создают.
Для чего в коде i<50; непонятно. Похоже что когда-то был цикл for, но его не совсем удачно заменили на while.
Код можно написать без goto используя цикл.
Реклама
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

Прошу прощения за "тормоза" в ответе. Оператор goto пока отодвигается в использование на неопределённое время ввиду ограниченности перескока. Сейчас код имеет несколько другой вид. Ваши замечания я сегодня опробую. И опишу "выплывшие" нюансы. Странный компилятор-он как человек "устает". Вчера весь день программировал, ясно что не получается, переделывал, снова проверял. Так вот вчера те-же самые команды "выпадали" в ошибки , а сегодня прокатывает. Проверить, на макете, могу только на работе, сейчас детей в школу проводить надо.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Billi34 писал(а):Странный компилято
обычно все проблемы "компилятора" спустя некоторое время объясняются свойствами прокладки между спинкой стула и монитором.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

Вах! как смешно! Может Вы не тем занимаетесь? Может Вам к КВНщикам податься?
А по теме всё заработало. И goto применил . Все очень похоже на BASIC. В простейшем применении.
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

Billi34, обычный goto работает только в рамках одной функции. Если есть нужна goto в другую функцию, используйте setjmp()/longjmp()
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="Billi34",url="/forum/viewtopic.php?p=3693174#p3693174"]А по теме всё заработало. И goto применил . Все очень похоже на BASIC. В простейшем применении.[/uquote]
В си о существовании goto лучше забыть сразу. Это не бейсик.
Я за >20 лет программирования на си и десятках реализованных проектов не использовал goto ни разу(!).
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

jcxz писал(а):В си о существовании goto лучше забыть сразу. Это не бейсик.
Я за >20 лет программирования на си и десятках реализованных проектов не использовал goto ни разу(!).
похоливарим? ;) где-то уже была темка...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

ARV, не здесь, пожалуйста. Идите в "МЯЯЯУ!". К языку религиозные вопросы использования или не использования существующего в нем оператора никакого отношения не имеют.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

ну, я ж не первый начал :) всё-всё, не буду больше :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3693189#p3693189"]Billi34, обычный goto работает только в рамках одной функции. Если есть нужна goto в другую функцию, используйте setjmp()/longjmp()[/uquote]
принял к сведению. Почитаю обучалки. Мне не очень нравится как код работает. Всречаются не верные переходы. И как раз с goto/
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Добрый день, подскажите пожалуйста, что делаю не так.
Стараюсь запустить usb, но этот код работает не правильно.
Код:

Код: Выделить всё

USB_BTABLE -> EP[number].USB_ADDR_TX = addr_tx;
USB_BTABLE -> EP[number].USB_COUNT_TX = 1;
USB_BTABLE -> EP[number].USB_ADDR_RX = addr_rx;
USB_BTABLE -> EP[number].USB_COUNT_RX = 0x8400;   //размер приемного буфера
Вторая строчка кода перезаписывает первую, а 4 перезаписывает третью. То есть если отслеживать состояние вкладки мемори, то видно как значения перезаписывают друг друга. Выравнивание структуры отключил и sizeof(USB_EPDATA_TypeDef) дает правильный результат. Работаю в Keil.
Код:

Код: Выделить всё

#define USB                  ((USB_TypeDef *) (0x40005C00))
#define USB_BTABLE_BASE         0x40006000
#define USB_BTABLE               ((USB_BtableDef *)(USB_BTABLE_BASE))

typedef struct{
   __IO uint32_t EPnR[8];
   __IO uint32_t RESERVED1;
   __IO uint32_t RESERVED2;
   __IO uint32_t RESERVED3;
   __IO uint32_t RESERVED4;
   __IO uint32_t RESERVED5;
   __IO uint32_t RESERVED6;
   __IO uint32_t RESERVED7;
   __IO uint32_t RESERVED8;
   __IO uint32_t CNTR;
   __IO uint32_t ISTR;
   __IO uint32_t FNR;
   __IO uint32_t DADDR;
   __IO uint32_t BTABLE;
   //__IO uint32_t LPMCSR;
   //__IO uint32_t BCDR;
} USB_TypeDef;
#pragma pack(2)
typedef struct{
   __IO uint16_t USB_ADDR_TX;
   __IO uint16_t USB_COUNT_TX;
   __IO uint16_t USB_ADDR_RX;
   __IO uint16_t USB_COUNT_RX;
} USB_EPDATA_TypeDef;

typedef struct{
   __IO USB_EPDATA_TypeDef EP[8];
} USB_BtableDef;
#pragma pack()

Код:

Код: Выделить всё

#pragma pack(1)
//Тип для расшифровки конфигурационного пакета
typedef struct {
   uint8_t bmRequestType;
   uint8_t bRequest;
   uint16_t wValue;
   uint16_t wIndex;
   uint16_t wLength;
} config_pack_t;
//Структура состояний конечных точек
typedef struct {
   uint16_t *tx_buf;
   uint8_t *rx_buf;
   uint16_t status;
   unsigned rx_cnt : 10;
   unsigned tx_flag : 1;
   unsigned rx_flag : 1;
   unsigned setup_flag : 1;
} ep_t;
//Статус и адрес соединения USB
typedef struct {
   uint8_t USB_Status;
   uint16_t USB_Addr;
} usb_dev_t;
#pragma pack()

Еще не понятно, почему sizeof(ep_t) = 12.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

baghear писал(а):Еще не понятно, почему sizeof(ep_t) = 12.
это как раз понятно: 2 указателя это 8 байт, еще два байта на uint16_t, и еще 2 байта на битоадресуемые поля (всего 13 бит). Итого 12 байт.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Спасибо, Это понял. А что скажете по первой части вопроса?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

[uquote="baghear",url="/forum/viewtopic.php?p=3694413#p3694413"]Спасибо, Это понял. А что скажете по первой части вопроса?[/uquote]Контроллер F103? У него доступ в PAM только 32-битный. Подробнее вечером.

ЗЫ: Поля структуры USB_EPDATA_TypeDef сделай uint32_t для начала. Ну и вообще, PAM у него "дырявая".
Последний раз редактировалось VladislavS Ср сен 04, 2019 13:33:06, всего редактировалось 1 раз.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Да 103VE.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

[uquote="baghear",url="/forum/viewtopic.php?p=3694424#p3694424"]Да 103VE.[/uquote]Через пару часиков скину функцию записи в PAM.

Для F103

Код: Выделить всё

typedef struct {
  uint32_t ADDR_TX;
  uint32_t COUNT_TX;
  uint32_t ADDR_RX;
  uint32_t COUNT_RX;
} EP_BUF_DSCR;


void WritePAM_TX(uint32_t EPNum, uint8_t *pSrcData, uint32_t cnt)
{
  uint32_t *pv = (uint32_t *)(USB_PMAADDR + (ep_buf_dscr[EPNum].ADDR_TX<<1));  
  for(uint32_t n = 0; n < (cnt + 1) / 2; n++, pSrcData += 2) 
  {
    *pv++ = *((uint16_t *)pSrcData);
  }
  ep_buf_dscr[EPNum].COUNT_TX = cnt;
  EP_Status(EPNum, USB_EP_TX_VALID);  
}
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Подскажите в чем смысл сдвига влево на один бит?

Код: Выделить всё

int32_t *pv = (uint32_t *)(USB_PMAADDR + (ep_buf_dscr[EPNum].ADDR_TX<<1)); 
И почему RAM дырявая?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

[uquote="baghear",url="/forum/viewtopic.php?p=3694827#p3694827"]Подскажите в чем смысл сдвига влево на один бит?[/uquote]Ровно потому же, почему инкремент указателя на 32-ю память pv при записи каждых двух бай увеличивает его значение на 4. А указатель буфера-источника на два. USB-память устроена из 32-битных слов, старшие два байта которых пустые. Пощупай это под отладчиком, это хорошо видно, куда и как приходят пакеты. Соответственно и отправлять их надо так же.

[uquote="baghear",url="/forum/viewtopic.php?p=3694827#p3694827"]И почему RAM дырявая?[/uquote]Перенаправлю этот вопрос STM. И от себя дополню вопросом почему они это в RM толком не написали.

Это всё F103 касается, у других контроллеров другие заморочки. И с организацией буфера, и с невыровненым доступом. У меня из-за этого уже целый зоопарк реализаций USB: два для OTG (F107, F411) и три для обычного (F0 и L0, F103, F303). Причём, отличие внутри групп именно в организации этого долбаного буфера.
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Re: Вопросы по С/С++ (СИ)

Сообщение Billi34 »

И снова здравствуйте. Наставьте на путь истинный.

t=1;i=0;
while(!PIND.B1&&i<20&&t)
{
if(i<18)
{
t=0 ;
goto mesto_1;
}
Delay_ms(100) ;i++;
}
следующая строка кода


Интересует как в данном случае работает МК в условиях цикла : пока на пин В1 ноль, переменная i меньше 20 и переменная t лог. единица. МК не выходит из цикла. По превышению i более 18 МК переходит в mesto_1. сбрасевает t в ноль. В случае возникновения ПИН В1 лог. единицы при значениях i меньше 18 МК переходит к оператору else.Так я думаю. 20 и 18 величины абстрактные что б внутреннее условие достигло своего значения до окончания цикла.
Последний раз редактировалось Billi34 Пт сен 06, 2019 15:12:59, всего редактировалось 2 раза.
Ответить

Вернуться в «Разные вопросы по МК»