Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79

Структура GPIO_TypeDef для регистров. STM32

25.04.2022, 08:48. Показов 7934. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Застрял на регистрах stm32.
Может кто нибудь подскажет?
Вопрос не в самих регистрах, а в языке Си.

Немного об устройстве регистров как я это вижу:
В файле stm32f10x.h находится структура:
C
1
2
3
4
5
6
7
8
9
10
 typedef struct
{
__IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
   __IO uint32_t ODR;
  __IO uint32_t BSRR;
 __IO uint32_t BRR;
  __IO uint32_t LCKR;
 } GPIO_TypeDef
*Я эту структуру у себя не нашёл, так же как и этот файл.

Затем делаются указатели для каждого порта и регистров.
#define GPIOA ((GPIO_TypeDef*)0x48000);
Я думаю затем заполняется где то вся эта структура GPIO_TypeDef, но где я не нашёл.

Затем идёт настройка регистров
C
1
GPIOA->ODR |=1UL<<14;
------------------------------------------------
В принципе то что выше можно не учитывать, я пример упрощу.
У меня не получается заполнить структуру по указателю.
Visual Studio выдаёт ошибку. МК у меня ещё нет, тренируюсь на обычных IDE.

Этот способ является правильным для заполнения структуры?
C
1
2
3
4
5
6
7
8
  struct gpio
 {
int reg;
};
int main(void)
{
    ((struct gpio*)0x45000)->reg=1;
}
Если да, то как вывести, увидеть, проверить значение находящееся по адресу 0x45000? Не используя HEX код?
Так не получается
C
1
printf("%d\n", *((int*)0x45000));
И разве не надо прежде чем присваивать значение указателю, сначала присвоить этому указателю структурную переменную?
C
1
2
3
4
5
6
7
8
9
10
  struct gpio
 {
int reg;
} new_struct;
int main()
{
struct gpio *ptr;
ptr=&new_struct;
ptr->reg=1;
}
То есть разница. Здесь ((struct gpio*)0x45000)->reg=1; напрямую указателю присваивается.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.04.2022, 08:48
Ответы с готовыми решениями:

Структура регистров накоплений
Необходимо написать свою конфигурацию для учёта материалов и товаров Приход материалов регистрируется документом ПриходМатериалов ...

GPIO_TypeDef has no member named BSR
Пытаюсь работать с пинами на прямую. void AY_out (u8 op, u8 reg) { if (reg&amp;1) {GPIOA-&gt;BSRR = GPIO_Pin_11;} else...

Вывести состояние сегментных регистров и регистров флагов (ассемблерная вставка)
Вывести в консоль состояние сегментных регистров и регистров флагов. Добавлено через 9 минут unsigned long num; _asm { pushf...

78
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
28.04.2022, 13:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от getstm32 Посмотреть сообщение
Только порядковые номера битов GPIO_InitStruct.Pin соответствуют порядковым номерам выводов МК. Остальное Mode,Pull,Speed,Alternate в зависимости от настроек.
Они соответствуют так, как написано в документации.
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
28.04.2022, 14:17  [ТС]
Я не так много видел, но из того что я видел,
define нулевого вывода везде определён как #define GPIO_Pin_0 ((uint16_t)0x0001)
итп.
Ок, есть может исключения.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define GPIO_Pin_0   ((uint16_t)0x0001)
#define     GPIO_Pin_1   ((uint16_t)0x0002)
#define     GPIO_Pin_2   ((uint16_t)0x0004)
#define     GPIO_Pin_3   ((uint16_t)0x0008)
#define     GPIO_Pin_4   ((uint16_t)0x0010)
#define     GPIO_Pin_5   ((uint16_t)0x0020)
#define     GPIO_Pin_6   ((uint16_t)0x0040)
#define     GPIO_Pin_7   ((uint16_t)0x0080)
#define     GPIO_Pin_8   ((uint16_t)0x0100)
#define     GPIO_Pin_9   ((uint16_t)0x0200)
#define     GPIO_Pin_10   ((uint16_t)0x0400)
#define     GPIO_Pin_11   ((uint16_t)0x0800)
#define     GPIO_Pin_12   ((uint16_t)0x1000)
#define     GPIO_Pin_13   ((uint16_t)0x2000)
#define     GPIO_Pin_14   ((uint16_t)0x4000)
#define     GPIO_Pin_15   ((uint16_t)0x8000)
#define     GPIO_Pin_All   ((uint16_t)0xFFFF)

Не вижу настройки каждого пина для Mode,Pull,Speed,Alternate.
#define GPIO_MODE_INPUT 0x00000000U
Как это приспособить для определённого пина?
То есть настройка пинов порта происходит всех сразу, а не поотдельности.
Как выбирают из 16 ти пинов нужный, чтоб дать модус нужный?
Здесь GPIO_InitStruct.Pin информация сразу о 16 ти пинах передаётся.
Как узнать для какого именно пина я хочу сделать это #define GPIO_MODE_INPUT 0x00000000U
Здесь #define GPIO_MODE_INPUT 0x00000000U ведь нет информации о порядковом номере пина.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
28.04.2022, 15:51
Цитата Сообщение от getstm32 Посмотреть сообщение
define нулевого вывода везде определён как #define GPIO_Pin_0 ((uint16_t)0x0001)
Не в хедерах, а в документации
Цитата Сообщение от getstm32 Посмотреть сообщение
Как это приспособить для определённого пина?
Как обычно - сдвигами и битовыми операциями. Не помню что у вас за камень, но на примере L1 и PA13:
C
1
GPIOA->MODER = (GPIOA->MODER &~(0b11<<(13*2))) | (0b01<<(13*2)); //не помню что это за режим, но да неважно
Цитата Сообщение от getstm32 Посмотреть сообщение
Здесь GPIO_InitStruct.Pin
Это не та ущербная CMSIS'ная чушь, для которой надо сначала заполнить структуру, потом вызвать функцию, и она после кучи ненужных проверок поменяет два бита?
Два бита можно поменять и руками. Это и для вас проще, и для камня.
Миниатюры
Структура GPIO_TypeDef для регистров. STM32  
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
28.04.2022, 16:50  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это не та ущербная CMSIS'ная чушь, для которой надо сначала заполнить структуру, потом вызвать функцию,
Если самому писать, то да.
Но у меня в хеадере сгенерированы уже эти структуры:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */
 
  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */
 
  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */
 
  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */
 
  uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins. 
                            This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;

То что вы написали, GPIOA например, тоже ведь на структуре основано, почему чушь. Эти структуры использует HAL постоянно.
Или это про другое
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
 typedef struct
{
__IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
   __IO uint32_t ODR;
  __IO uint32_t BSRR;
 __IO uint32_t BRR;
  __IO uint32_t LCKR;
 } GPIO_TypeDef

В эту структуру сохраняется временная информация о пинах порта GPIO_InitTypeDef. А из этой структуры передаётся информация в регистры порта через функцию HAL_GPIO_Init.
То что сдвигами можно значение менять, это понятно, но когда имеешь 16 единичек одновременно, то непонятно какому именно выводу менять модус надо.И в одной переменной Alternate не может сохраниться одновременно 10 и 111 для двух разных пинов.
Ок, мне наверное надо больше почитать.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
28.04.2022, 21:08
Цитата Сообщение от getstm32 Посмотреть сообщение
Если самому писать, то да.
Это в любом случае. Вам же эту структуру заполнять.
Цитата Сообщение от getstm32 Посмотреть сообщение
То что вы написали, GPIOA например, тоже ведь на структуре основано, почему чушь. Эти структуры использует HAL постоянно.
Ну разумеется, нет! Я заполняю те регистры, которые есть в самом контроллере, пусть даже доступ к ним организован через структуру GPIO. Но это все равно прямая работа с регистрами контроллера.
В HAL же идет вызов каких-то мутных функций, которым передаются не менее мутные параметры, чтобы после пяти уровней вложенности получить тот же эффект, но с кучей ненужных проверок и накладных расходов. На Хабре есть статья по сравнению нормальной реализации USB и HAL'овской. Разница раза в полтора сами понимаете в чью пользу.
Так что чушь это про вызов ненужных функций, которые переведут структуру настроек в биты регистров, а не про использование структур вообще.
Цитата Сообщение от getstm32 Посмотреть сообщение
В эту структуру сохраняется временная информация о пинах порта GPIO_InitTypeDef. А из этой структуры передаётся информация в регистры порта через функцию HAL_GPIO_Init.
Вот-вот. Сначала вы тратите время на заполнение структуры, потом функция ее обрабатывает, проверяет, и только потом выставляет два бита.
Цитата Сообщение от getstm32 Посмотреть сообщение
То что сдвигами можно значение менять, это понятно, но когда имеешь 16 единичек одновременно, то непонятно какому именно выводу менять модус надо.
Приведите пример, когда непонятно. У меня пока таких проблем не возникало.
Цитата Сообщение от getstm32 Посмотреть сообщение
И в одной переменной Alternate не может сохраниться одновременно 10 и 111 для двух разных пинов.
А что мешает?
GPIOA->AFR = (GPIOA->AFRL &~(0b1111<<(5*4) | 0b1111<<(7*4))) | (0b0011<<(5*4) | (0b1100<<7*4);
Просто обычно выводы настраиваются по одному, так человеку проще отслеживать. А на этапе инициализации неэффективность кода далеко не так критична.
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
29.04.2022, 05:02  [ТС]
Мне надо теорией запастись))
Цитата Сообщение от getstm32 Посмотреть сообщение
В эту структуру сохраняется временная информация о пинах порта GPIO_InitTypeDef. А из этой структуры передаётся информация в регистры порта через функцию HAL_GPIO_Init.
Не дописал немного:
В эту структуру сохраняется временная информация о пинах порта GPIO_InitTypeDef. А из этой структуры GPIO_TypeDef передаётся информация в регистры порта через функцию HAL_GPIO_Init.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А как иначе вы хотели сделать указатель на существующий массив данных? В Си другого способа нет.
Всё так, просто в указателе для массива нельзя выходить за пределы этого массива. А в указателе для переменной нельзя выходить за пределы этой переменной.
char *screenPtr = (char*)(0xA0000000);
screenPtr == указатель на одну переменную типа char, за её границы выходить нельзя screenPtr[1].
Как сделать указатель на массив по адресу я не нашёл.
Должно быть наверное что то такого:
char *screenPtr = (char[10]*)(0xA0000000); неправильный пример
А может и правда нет специальной конструкции для массивов.
Тогда непонятно как следить вышел ли я за границы или нет.
Может здесь и не надо следить, просто надо быть уверенным что записываешь в ту область памяти где ничего другого нет И НЕ БУДЕТ.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
29.04.2022, 06:33
Цитата Сообщение от getstm32 Посмотреть сообщение
Как сделать указатель на массив по адресу я не нашёл.
да пожалуйста
C
1
2
3
uint32_t a=100;
uint8_t* b=(uint8_t*)&a;
b[1]=10;
Цитата Сообщение от getstm32 Посмотреть сообщение
Тогда непонятно как следить вышел ли я за границы или нет.
в языке нет таких конструкций, может сработать аппаратура(STM32) или ОС(Windows, Linux), программист сам должен за этим следить
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
29.04.2022, 10:20
Цитата Сообщение от getstm32 Посмотреть сообщение
Всё так, просто в указателе для массива нельзя выходить за пределы этого массива.
Мне надо теорией запастись))
Вот в том-то и дело. Посмотрите как работают функции работы со строками strcpy и подобные. Они ведь принимают на вход указатель на начало массива символов. Почему же этот подход должен ломаться при передаче указателя на начало любого другого типа данных?
Цитата Сообщение от getstm32 Посмотреть сообщение
Тогда непонятно как следить вышел ли я за границы или нет.
Никак. В Си нет встроенного механизма отслеживания границ. Но не забывайте, что в тех языках, в которых он есть, он не бесплатен. В программу добавляются проверки диапазона адресов, причем, в отличие от Си, их не выкинуть ради ускорения.
С другой стороны, если вы по определенному адресу накладываете структуру и точно знаете, что она туда накладывается правильно, чего вам опасаться? За пределы структуры просто так тоже не выйдете.
Или тот же экранный буфер. Вам так и так проверять координаты выводимого пикселя по X,Y чтобы не пытаться рисовать точку, скажем, (10500, 2), она все равно за пределами экрана 320x200, но (10500 + 2*320 = 11140) в массив попадает.
Цитата Сообщение от getstm32 Посмотреть сообщение
char *screenPtr = (char[10]*)(0xA0000000); неправильный пример
Обычные массивы тоже не защищают от выхода за границы:
C
1
2
3
4
char arr[10];
int j=0;
arr[11] = 1;
printf("%i\n", j);
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
29.04.2022, 11:05  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот в том-то и дело. Посмотрите как работают функции работы со строками strcpy и подобные.
Подход другой. При использовании strcpy вы же не нарушаете границы того массива, куда копируете.
char *screenPtr = (char*)(0xA0000000); А здесь этих границ вообще не предусмотрено, на усмотрение программиста.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Обычные массивы тоже не защищают от выхода за границы:
Главное что эти границы ЕСТЬ.
char *screenPtr = (char*)(0xA0000000); Здесь этих границ нет.
Цитата Сообщение от ValeryS Посмотреть сообщение
да пожалуйста
Нет, это не массив
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
Это тоже повреждение данных за пределами переменной.
Выделили память для одной переменной и вышли за её пределы.
Ок, это инструмент, которым можно пользоваться в МК, я понял. Хороший инструмент.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
29.04.2022, 11:29
Цитата Сообщение от getstm32 Посмотреть сообщение
Нет, это не массив
а что же это?
int это же массив 4 char
вся память делается байтами, а байт в Си это char
вот более правильное описание
C
1
2
3
4
5
union
{
uint32_t i;
uint8_t b[sizeof(uint32_t)];
}
Цитата Сообщение от getstm32 Посмотреть сообщение
Ок, это инструмент, которым можно пользоваться в МК,
не только в МК, не зря Си называют "высокоуровневый ассемблер"
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
29.04.2022, 11:44  [ТС]
Ок. Не заметил что вы тип указателя сменили.
Маленький массив получился, ок.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
29.04.2022, 12:00
Цитата Сообщение от getstm32 Посмотреть сообщение
char *screenPtr = (char*)(0xA0000000); А здесь этих границ вообще не предусмотрено, на усмотрение программиста.
В смысле не предусмотрено? Там "аппаратно" выделен "массив" 64000 байт, привязанный к экрану.
Цитата Сообщение от getstm32 Посмотреть сообщение
Главное что эти границы ЕСТЬ.
Так в чем разница-то? Там вы программно выделили сколько-то байт на переменную (причем этот размер нигде не хранится), тут сколько-то байт выделено железом. Причем этот размер точно так же нигде не хранится.
В зависимости от вашей терминологии, можно считать, что либо и там и там выделены массивы, либо что указатели.
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
29.04.2022, 12:59  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так в чем разница-то? Там вы программно выделили сколько-то байт на переменную (причем этот размер нигде не хранится)
C
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    char a;  //Здесь я выделил память под ОДНУ переменную типа char.
    char* ptr = &a;  //Здесь передаю адрес этой переменной указателю
    printf("%p\n", &a);  //Это адрес, где хранится переменная типа  char
    printf("%p\n", &ptr[0]);  //Это тот же  адрес где хранится переменная типа char
    printf("%p\n", &ptr[1]); /*А если я запишу что либо за пределы этой переменной, 
                             по адресу &ptr[1], то поврежу код. Система видит этот 
                             адрес &ptr[1] как свободный и может в любой момент записать 
                             туда что захочет.*/
}
Я не говорю про МК, где может можно следить за местами куда пишешь что либо.

C
1
2
3
4
5
6
7
8
9
10
int main()
{
    char a;
    char* ptr = &a;
    ptr[1]=2;  //Здесь выхожу за пределы переменной 'a' и записываю в переменную 'b'
    char b;    //Переменной 'b' ни напрямую ни через указатель ничего не присваивал, заметьте. (Через указатель вышел за пределы переменной 'а')
    printf("%p\n", &a); //Адреса переменных 'a' и 'b' идут по порядку.
    printf("%p\n", &b); //Адреса переменных 'a' и 'b' идут по порядку.
    printf("%d\n",b); //Переменной 'b' ничего не было присвоено, но значение она имеет. Пример того, что описал выше.
}
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
29.04.2022, 13:36
C
1
2
3
4
5
6
7
char arr[80];
struct{
  uint64_t a,b,c,d,e,f,g,h,i,j;
}str;
char *p1 = (char*)arr;
char *p2 = (char*)&str;
char *p3 = (char*)(0xA0000000); //по данному адресу находится "переменная", созданная кем-то еще.
Цитата Сообщение от getstm32 Посмотреть сообщение
Выделить код
А что вы продемонстрировать-то хотели? Что если вылезти за границы одной переменной, можно попасть в другую? Ну да, можно, но лучше так не делать. Это должно как-то противоречить сказанному мной?
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
29.04.2022, 13:54  [ТС]
Каждый из портов МК занимает 1 Килобайт.
Куда так много памяти тратится?
Один регистр ==32 бит==4 Байт.
1024/4=256
Получается можно хранить 256 регистров в одном Килобайте.
Не думаю что столько регистров есть. Не знаю сколько их всего, но часто используемых я насчитал 9 штук.
Про запас остальные Байты?
Миниатюры
Структура GPIO_TypeDef для регистров. STM32  
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
29.04.2022, 14:45
Цитата Сообщение от getstm32 Посмотреть сообщение
Каждый из портов МК занимает 1 Килобайт.
Куда так много памяти тратится?
Тратится не память, а адресное пространство. Физически никаких транзисторов, соответствующих, например, 0x4800`03F0, нет. А адресное пространство - его там 4 ГБ "бесплатно", можно не экономить. Может, схемотехника так проще получалась - проверили 13-31 биты, убедились, что попали в GPIO. Далее 10 - 12 биты выбор конкретного порта, ну а что осталось - выбор регистра внутри порта.
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
30.04.2022, 04:29  [ТС]
Это странно, потому что написано 1 Килобайт.
Если речь бы шла о адресах, то указывалось бы в шестнадцатеричном виде 0х400
Я же не покупаю жёсткий диск на 1 террабайт, а мне говорят: знаете, у нас там не всё заполнено, поэтому диск реально на 1 килобайт.
Слева указан диапазон адресов, правее объём памяти.
Нигде не могу найти Memory Map для регистров, есть только разбросанные начальные адреса регистров(Address offset).
Address offset - то есть смещение относительно начального адреса порта.
Минимум информации о регистрах.
Но регистр ведь состоит из 4 х Байт, а начальный адрес регистра это наверное первый Байт регистра.
Ок, вы говорите что между регистрами есть большие пустоты, для этого я и ищу Memory Map для регистров чтоб узнать какие адреса реально заполнены и имеют адреса, а какие адреса пустые.
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
30.04.2022, 07:03  [ТС]
В некоторых datasheet есть register map, но тоже без адресов, только смещение.
Судя по этим смещениям каждый регистр занимает 4 Байта и все они идут по порядку. Где там промежутки то.
Миниатюры
Структура GPIO_TypeDef для регистров. STM32  
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
30.04.2022, 07:11  [ТС]
Moder ==Смещение 0 (Занимает 4 Байта)
Otyper ==Смещение 4 (Перед этим регистром были 4 Байта регистра Moder, значит смещение 4)
Ospeedr ==Смещение 8(Перед этим регистром были 4 Байта регистра Moder+4 Байта регистра Otyper, значит смещение 8)
Pupdr==Смещение 12 (Перед этим регистром были 4 Байта регистра Moder+4 Байта регистра Otyper+4 Байта регистра Ospeedr, значит смещение 12)
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
30.04.2022, 08:47
Цитата Сообщение от getstm32 Посмотреть сообщение
Это странно, потому что написано 1 Килобайт.
Цитата Сообщение от getstm32 Посмотреть сообщение
Я же не покупаю жёсткий диск на 1 террабайт, а мне говорят: знаете, у нас там не всё заполнено, поэтому диск реально на 1 килобайт.
это не память, не надо воспринимать дословно, это устройство ввода-вывода, там не объем памяти меряют, а диапазон адресов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.04.2022, 08:47

Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе
Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе. ORG 0 mov...

Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры)
требуется разработать программу вывода на экран двоичного содержимого двух регистров так, чтобы первоначальное содержимое этих регистров...

Структура таблицы для ввода номенклатуры в БД Аксесс 2003+ структура изделия
Доброго времени суток форумчане! Продолжаю писать свою самоделку, возник вопрос: Номенклатуру в БД надо вводить в одно поле (...

Конфигурация регистров для использования внешнего clock для таймера
Добрый день. N-ое количество дней уже не могу правильно сконфигурировать схему с подсчетом импульсов. Имеется мастер таймер, каждую секунду...

структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ
структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ с указанным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru