Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Почему-то классические программные прерывания не применяются на практике (не видел).
изучения программирования встроенных систем, ОС реального времени, Ассемблера и С— ничему хорошему не научитесь.
Сделайте, пожалуйста, что-то подобное, снабдите правильными примерами, без goto, хорошо структурированными, а мы — поучимся и даже критиковать не будем, только поапплодируем.uc/OS, FreeRTOS, esOS и т.д — хорошо структурированные, без goto — качайте, смотрите, учитесь (комментированы слабовато, но уж тут что есть, у Вас не лучше).
Подскажите, что применить для вызова системных подпрограмм из программы пользователя, когда разница в адресах больше 26 МБайт (больше в коде команды перехода не помещается, там ведь еще и код команды кроме адреса).эта проблема решается линкерами (что, на мой взгляд, не есть хорошо) путем создания промежуточной команды длинного перехода, также существует, причем условная, команда длиного перехода по регистру. В любом случае это будет в разы быстрее, чем диспетчер вызовов.
Современный подход мне не нравится, программы надо предустанавливать, вместо того, чтобы загружать в память и выполнятьМы вообще о встроенных системах говорим?
Пользователи бывают очень разные, кому-то понятнее goto (while тоже в примерах есть)Не знаю, как Вас, но меня люди, не способные понять while, просто не интересуют, им не место в современном программировании. Я хорошо разбираюсь в ассемблере и прекрасно знаю, что в машинных командах нет (ну или почти нет) команд непосредственной организации цикла и внутри прячется переход, но любой язык программирования — это повышение уровня абстракции и не следует идти в обратном направлении.
Стандартный оператор printf занимает очень много памяти, еще и сбоит в работе, поэтому в платах Samsung для Linux его переписали, заменив своимЯ про него ничего не говорил, но, вообще то, в современных компиляторах есть возможность существенно уменьшить объем, занимаемый реализацией даного оператора, сбоев в работе лично я не наблюдал (наверное, везло, а может быть, Вы просто не умеете его готовить?), и если стандартный оператор вылизан годами интенсивной эксплуатации, то про реализацию Самсунга ничего сказать нельзя.
Кстати, насчет «корявости» кода, просмотрев множество текстов для Linux и фирменных Samsung, вот тут уж — слов нету просто. StartOS содержит порядка 6000 строк кода, компилируется в загрузочный файл менее 32 КБайт (вполне себе эффективно), и главное — работаетКак говорится, «указав другому на грязные плавники, Вы не станете плавать быстрее». Да, многие коды лично мне было бы стыдно выкладывать на всеобщее обозрение, но у авторов могут быть свое мнение по данному поводу. Размер загрузочного файла не имеет ни малейшего отношения к правильности оформления кода и соблюдения принципов структурирного программирования. Есть еще одно прекрасное выражение «Мы пишем программы не для компиляторов, а для других людей» и если мы можем, не уменьшая эффективности, сделать код более понятным и читаемым, то мы это сделать обязаны. Ну а последний аргумент — «главное, работает» просто приводит в изумление.
Насчет «нерекомендования», боюсь, Вы опоздали, люди всё это уже используют (да еще и хвалят). И порекомендуйте своё, что-нибудь хорошее.И это просто пугает, то есть люди начинают думать, что так можно писать программы, а потом будут ссылаться — ну у них же не хуже, чем в Ваших примерах, а их похвалили. То есть мы стремимся ускорить деградацию качества программного продукта. Простите, но я не верю, что человек, не способный правильно (то есть понятно) расставить скобки в операторе if, может иметь какие-то глубокие мысли относительно содержательной части данных операторов. Для себя, для какой-то быстрой поделки — пожалуйста, но выкладывать такое на всеобщее обозрение — сильно. Многие хорошие программисты вообще рекомендуют, что всегда нужно писать так, чтобы не стыдно было показать код другим, это дисциплинирует.
Кстати, чего плохого в DEC? Реентерабельность, реккурентные вызовы подпрограмм, сопрограммы, трюки на ассбемблере, где они все сейчас, среди перлов и питонов?Где я что-то плохое сказал про DEC? Это была превосходная (для своего времени) разработка, я на ней учился и многие вещи считаю эталоном. Просто хотелось бы заметить, что системные вызовы не были реентрабельными, это прямо указывалось в документации, сопрограммы легко реализовывались путем учета особенностей команды вызова, но не особо рекомендовались, а трюки на ассемблере — надо понимать, что они росли из необходимости вводить код руками через клавиатурный монитор или панель с клавишами, и применять их в наше время нет никаких оснований.
Хочу — сделаю себе ОС, хочу — свои библиотеки и свой компилятор текста в двоичный код, назову операторы тоже как хочу, кто мне запретит.Да Бога ради, просто для того, чтобы назвать опереаторы по своему, нужно быть твердо уверенным в том, что неудобства, связанные с необходимостью переучиваться на новые названия, не превысят выигрыша от подобного переименования, то есть надо быть настолько уверенным в гениальности своих предложений, что простого звания лауреата
Первого всесоюзного конкурса самодеятельных программистов СССРбудет явно недостаточно.
// RT-210s (StartOS) K1...K4 Interrupt Example Sketch
#define U32 unsigned int
#define U16 unsigned short
#define U8 unsigned char
////////////////////////////
// VIC
#define VIC0RAWINTR (*(U32 *)0xF2000008)
#define VIC0IRQSTATUS (*(U32 *)0xF2000000)
#define VIC0FIQSTATUS (*(U32 *)0xF2000004)
#define VIC0INTENABLE (*(U32 *)0xF2000010)
#define VIC0INTSELECT (*(U32 *)0xF200000C)
#define VIC0VECTADDR16 (*(U32 *)0xF2000140)
#define VIC0VECTADDR17 (*(U32 *)0xF2000144)
#define VIC0VECTADDR18 (*(U32 *)0xF2000148)
#define VIC0VECTADDR19 (*(U32 *)0xF200014C)
#define VIC0ADDRESS (*(U32 *)0xF2000F00)
#define EXT_INT_1_CON (*(U32 *)0xE0200E04) // EXT_INT[8]...EXT_INT[15]
#define EXT_INT_1_MASK (*(U32 *)0xE0200F04)
#define EXT_INT_1_PEND (*(U32 *)0xE0200F44)
#define EXT_INT_2_CON (*(U32 *)0xE0200E08) //EXT_INT[16]...EXT_INT[23]
#define EXT_INT_2_MASK (*(U32 *)0xE0200F08)
#define EXT_INT_2_PEND (*(U32 *)0xE0200F48)
#define GPH2CON (*(U32 *)0xE0200C40)
#define GPH2DAT (*(U32 *)0xE0200C44)
void Isr_Init ( void );
void K_EINT16 (void);
int i;
int addr, num;
Main (void)
{
Isr_Init ( );
while (1)
{
if ( num )
{
Printf ( 10, 20,"Key ISR, Addr = %8x", addr );
Printf ( 10, 30,"Key Status = %8x", num );
Buzz ( num*1000, 20 );
num = 0;
addr = 0;
}
i++;
Printf (10,10,"Counter Value = %8d", i );
Delay ( 50 );
}
}
//////////////////////////////////////////
void Isr_Init ( void )
{
VIC0VECTADDR16 = (U32)K_EINT16;
GPH2CON |= ( 0xF << 0 ); // Pin function 1111: EXT_INT[16]
GPH2CON |= ( 0xF << 4 ); // Pin function 1111: EXT_INT[17]
GPH2CON |= ( 0xF << 8 ); // Pin function 1111: EXT_INT[18]
GPH2CON |= ( 0xF << 12 ); // Pin function 1111: EXT_INT[19]
EXT_INT_2_CON &=~( 0xF << 0 );
EXT_INT_2_CON |= ( 2 << 0 ); // Edge 010 = Falling, 011 = Rising
EXT_INT_2_MASK &= ~( 1 << 0); // EXT_INT_2_MASK for EXT_INT[16]
EXT_INT_2_CON &=~( 0xF << 4 );
EXT_INT_2_CON |= ( 2 << 4 );//Edge 010 = Falling, 011 = Rising
EXT_INT_2_MASK &= ~( 1 << 1);//EXT_INT_2_MASK for EXT_INT[17]
EXT_INT_2_CON &=~( 0xF << 8 );
EXT_INT_2_CON |= ( 2 << 8 );//Edge 010 = Falling, 011 = Rising
EXT_INT_2_MASK &= ~( 1 << 2);//EXT_INT_2_MASK for EXT_INT[18]
EXT_INT_2_CON &=~( 0xF << 12 );
EXT_INT_2_CON |= ( 2 << 12 );//Edge 010 = Falling, 011 = Rising
EXT_INT_2_MASK &= ~( 1 << 3);//EXT_INT_2_MASK for EXT_INT[19]
VIC0INTSELECT &= ~(1<<16);//Set Mode bit: IRQ and not FIQ
VIC0INTENABLE |= (1<<16);//Enable EINT[16]
VIC0ADDRESS = 0;//Clear VIC0ADDRESS
}
void K_EINT16 (void)
{
num = EXT_INT_2_PEND;
addr = VIC0ADDRESS;
EXT_INT_2_PEND |= num;//Reset reason of interrupt
}
Создавать программы можно в средах ADS1.2 (Metrowerks CodeWarrior), IAR, Keil и других
. . .
;---- первый способ
LDR r2, text1 ; загружаем адрес текста 1 в регистр r2
. . .
text1 DCD txt ; содержит адрес "Hello"
. . .
txt DCB "Hello",0 ; содержит буквы H, e, l, l, o и 0
. . .
;---- первый способ
LDR r2, =txt ; загружаем адрес txt в регистр r2
. . .
txt DCB "Hello",0 ; содержит буквы H, e, l, l, o и 0
void Main(void)
{
Print_String (20, 150, "Hello, World!");
}
Компактная ОС для ARM процессоров