Вопросы по С/С++ (СИ)
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Вопросы по С/С++ (СИ)
слева есть плюс и минус.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Реклама
Re: Вопросы по С/С++ (СИ)
[uquote="Billi34",url="/forum/viewtopic.php?p=3692332#p3692332"]Помогите в синтаксисе этого компилятора[/uquote]На картинке немного странный код.Цикл while в данном случае ограничивается точкой с запятой, т. е. Зачем часть кода вынесена в фигурные скобки непонятно. К циклу они отношения не имеют, а путаницу создают.
Для чего в коде i<50; непонятно. Похоже что когда-то был цикл for, но его не совсем удачно заменили на while.
Код можно написать без goto используя цикл.
Код: Выделить всё
while(!PIND.B1)i=0;i<50;//пока Д1 ноль сч считает и в случае переполнения
{
Delay_ms(10);i++;//выходит на начало иначе далее по программе
}
goto mesto_1Код: Выделить всё
while(!PIND.B1)i=0;Для чего в коде i<50; непонятно. Похоже что когда-то был цикл for, но его не совсем удачно заменили на while.
Код можно написать без goto используя цикл.
Re: Вопросы по С/С++ (СИ)
Прошу прощения за "тормоза" в ответе. Оператор goto пока отодвигается в использование на неопределённое время ввиду ограниченности перескока. Сейчас код имеет несколько другой вид. Ваши замечания я сегодня опробую. И опишу "выплывшие" нюансы. Странный компилятор-он как человек "устает". Вчера весь день программировал, ясно что не получается, переделывал, снова проверял. Так вот вчера те-же самые команды "выпадали" в ошибки , а сегодня прокатывает. Проверить, на макете, могу только на работе, сейчас детей в школу проводить надо.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
обычно все проблемы "компилятора" спустя некоторое время объясняются свойствами прокладки между спинкой стула и монитором.Billi34 писал(а):Странный компилято
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Вах! как смешно! Может Вы не тем занимаетесь? Может Вам к КВНщикам податься?
А по теме всё заработало. И goto применил . Все очень похоже на BASIC. В простейшем применении.
А по теме всё заработало. И goto применил . Все очень похоже на BASIC. В простейшем применении.
- Реклама
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Billi34, обычный goto работает только в рамках одной функции. Если есть нужна goto в другую функцию, используйте setjmp()/longjmp()
Re: Вопросы по С/С++ (СИ)
[uquote="Billi34",url="/forum/viewtopic.php?p=3693174#p3693174"]А по теме всё заработало. И goto применил . Все очень похоже на BASIC. В простейшем применении.[/uquote]
В си о существовании goto лучше забыть сразу. Это не бейсик.
Я за >20 лет программирования на си и десятках реализованных проектов не использовал goto ни разу(!).
В си о существовании goto лучше забыть сразу. Это не бейсик.
Я за >20 лет программирования на си и десятках реализованных проектов не использовал goto ни разу(!).
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
похоливарим?jcxz писал(а):В си о существовании goto лучше забыть сразу. Это не бейсик.
Я за >20 лет программирования на си и десятках реализованных проектов не использовал goto ни разу(!).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
ARV, не здесь, пожалуйста. Идите в "МЯЯЯУ!". К языку религиозные вопросы использования или не использования существующего в нем оператора никакого отношения не имеют.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
ну, я ж не первый начал
всё-всё, не буду больше 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3693189#p3693189"]Billi34, обычный goto работает только в рамках одной функции. Если есть нужна goto в другую функцию, используйте setjmp()/longjmp()[/uquote]
принял к сведению. Почитаю обучалки. Мне не очень нравится как код работает. Всречаются не верные переходы. И как раз с goto/
принял к сведению. Почитаю обучалки. Мне не очень нравится как код работает. Всречаются не верные переходы. И как раз с goto/
Re: Вопросы по С/С++ (СИ)
Добрый день, подскажите пожалуйста, что делаю не так.
Стараюсь запустить usb, но этот код работает не правильно.
Код:
Вторая строчка кода перезаписывает первую, а 4 перезаписывает третью. То есть если отслеживать состояние вкладки мемори, то видно как значения перезаписывают друг друга. Выравнивание структуры отключил и sizeof(USB_EPDATA_TypeDef) дает правильный результат. Работаю в Keil.
Код:
Код:
Еще не понятно, почему sizeof(ep_t) = 12.
Стараюсь запустить 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; //размер приемного буфераКод:
Код: Выделить всё
#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: Вопросы по С/С++ (СИ)
это как раз понятно: 2 указателя это 8 байт, еще два байта на uint16_t, и еще 2 байта на битоадресуемые поля (всего 13 бит). Итого 12 байт.baghear писал(а):Еще не понятно, почему sizeof(ep_t) = 12.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Спасибо, Это понял. А что скажете по первой части вопроса?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="baghear",url="/forum/viewtopic.php?p=3694413#p3694413"]Спасибо, Это понял. А что скажете по первой части вопроса?[/uquote]Контроллер F103? У него доступ в PAM только 32-битный. Подробнее вечером.
ЗЫ: Поля структуры USB_EPDATA_TypeDef сделай uint32_t для начала. Ну и вообще, PAM у него "дырявая".
ЗЫ: Поля структуры USB_EPDATA_TypeDef сделай uint32_t для начала. Ну и вообще, PAM у него "дырявая".
Последний раз редактировалось VladislavS Ср сен 04, 2019 13:33:06, всего редактировалось 1 раз.
Re: Вопросы по С/С++ (СИ)
Да 103VE.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="baghear",url="/forum/viewtopic.php?p=3694424#p3694424"]Да 103VE.[/uquote]Через пару часиков скину функцию записи в PAM.
Для F103
Для 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);
}Re: Вопросы по С/С++ (СИ)
Подскажите в чем смысл сдвига влево на один бит?
И почему RAM дырявая?
Код: Выделить всё
int32_t *pv = (uint32_t *)(USB_PMAADDR + (ep_buf_dscr[EPNum].ADDR_TX<<1)); - VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[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). Причём, отличие внутри групп именно в организации этого долбаного буфера.
[uquote="baghear",url="/forum/viewtopic.php?p=3694827#p3694827"]И почему RAM дырявая?[/uquote]Перенаправлю этот вопрос STM. И от себя дополню вопросом почему они это в RM толком не написали.
Это всё F103 касается, у других контроллеров другие заморочки. И с организацией буфера, и с невыровненым доступом. У меня из-за этого уже целый зоопарк реализаций USB: два для OTG (F107, F411) и три для обычного (F0 и L0, F103, F303). Причём, отличие внутри групп именно в организации этого долбаного буфера.
Re: Вопросы по С/С++ (СИ)
И снова здравствуйте. Наставьте на путь истинный.
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 величины абстрактные что б внутреннее условие достигло своего значения до окончания цикла.
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 раза.


