реклама на сайте
подробности

 
 
> Уменьшение минимального кол-ва стека, TNKernel :-)
DASM
сообщение Mar 29 2007, 06:18
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Боюсь уже автора задолбать, поэтому спрашиваю у всех.
Есть такая штука.. tn_switch_context
Там такой код
Код
tn_sw_restore
        ldmfd  sp!, {r0}
        ldmfd  sp!, {r1}
        msr    CPSR_cxsf, r1; с этой точки прерывания разрешены ! Комментарий мой
        msr    SPSR_cxsf, r0

        mrs    r4, CPSR
        bic    r4, r4, #NOINT
        msr    CPSR_c, r4

        ldmfd  sp!, {r0-r12,lr,pc}

То есть стек задачи еще не развернут, прерывания разрешены. Наступление прерывания, требующего переключения контекста в нем затребует у этой задачи еще 15*4=60 байт стека. (вернее надо будет 68 байт, но 8 мы уже отыграли назад) Вот дальше у меня сомнения - сколько раз такое может произойти...
В реалии раза 3-4 я точно наблюдаю - хорошо видно по использованию стека. Как уменьшить тоже понятно - перенести восстановление CPSR после развертывания большей части стека через ldmfd sp!, {r0-r12,lr,pc}.
Но вот по идее то все равно, сколько раз такое может произойти - вобщем-то определить невозможно, а значит и минимальный требуемый стек для потока должен стремиться к бесконечности ?
Замена вышепреведенного кода на вот такой (жутко наивный, но все же)
Код
     ldmfd  sp!, {r0}        
        ldr r1, =t_spsr
        str r0, [r1]
        ldmfd  sp!, {r0}
        ldr r1, =t_cpsr
        str r0, [r1]

        ldmfd  sp!, {r0-r12,lr}
        push {r1}
        ldr r1, =t_spsr
        ldr r1,[r1]
        msr    SPSR_cxsf, r1
        ldr r1, =t_cpsr
        ldr r1,[r1]
        msr    CPSR_cxsf, r1
        pop {r1}    
        ldmfd  sp!, {pc}

уменьшила требуемый стек очень прилично.
Вопрос возник не праздно, прокачивю через USB большой поток.. и в результате например банальная tn_idle_task благополучно через перваливала за 96 слов требуемого стека, при том что по умолчанию он 48. Но все равно как я понимаю не застрахован и в этом случае. Какие будут соображения ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Mar 26 2008, 15:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Вобщем "неправильное" использование полей мне не давало покоя и я модернизировал код TNKernel.

1. В структуру CDLL_QUEUE добавил еще одно поле - void *value - это адрес родительского объекта.

2. Во всех инициализациях объектов ОС, содержащих поля типа CDLL_QUEUE, в этих полях инициализируется поле void *value. адресом родительского объекта



Преимущества очевидны - избавились от методов:

TNT_TCB * get_task_by_timer_queque(CDLL_QUEUE *que);
TNT_TCB * get_task_by_block_queque(CDLL_QUEUE *que);
TNT_TCB * get_task_by_tsk_queue(CDLL_QUEUE *que);
TN_MUTEX *get_mutex_by_mutex_queque(CDLL_QUEUE *que);
TN_MUTEX *get_mutex_by_wait_queque(CDLL_QUEUE *que);
TN_MUTEX *get_mutex_by_lock_mutex_queque(CDLL_QUEUE *que);

Возвращающих объект по адресу списка que. Теперь все вызовы вышеперечисленых методов заменены на строку:

que->value;



Таким образом получили более меньше кода, больше скорости:-)

Хотелось бы, конечно, послушать комментарии автора сей замечательной RTOS. Возможно, из-за недопонимания я где то ошибаюсь. Хотя мой проект, имеющий четыре задачи, и использующий события, семафоры и мьютексы пережил сутки без сбоев.


--------------------
Go to the top of the page
 
+Quote Post
VslavX
сообщение Mar 15 2010, 15:46
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(prottoss @ Mar 26 2008, 17:30) *
Преимущества очевидны - избавились от методов:

TNT_TCB * get_task_by_timer_queque(CDLL_QUEUE *que);
...

Возвращающих объект по адресу списка que. Теперь все вызовы вышеперечисленых методов заменены на строку:

que->value;

Это делается еще проще:

#define CONTAINING_RECORD(address, type, field) ((type *)( (PBYTE)(address) - (PBYTE)(&((type *)0)->field)))

#define get_task_by_tsk_queue(que) CONTAINING_RECORD(que, TN_TCB, task_queue)

ну и остальные методы также - и никаких дополнительных полей и обращений к памяти
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DASM   Уменьшение минимального кол-ва стека   Mar 29 2007, 06:18
- - yuri_t   Подумаю, поэксперементирую и обязательно отвечу. Е...   Mar 29 2007, 12:11
- - yuri_t   Отвечаю по-порядку... ЦитатаНо вот по идее то все...   Mar 30 2007, 20:07
- - Alex B._   >> После создания tn_idle_task стек занимает...   Mar 30 2007, 22:43
- - yuri_t   В авторском варианте TNKernel вложенные прерывания...   Mar 30 2007, 23:34
|- - spf   Цитата(yuri_t @ Mar 31 2007, 02:34) В авт...   Mar 31 2007, 05:22
|- - DASM   Цитата(spf @ Mar 31 2007, 06:22) Существе...   Mar 31 2007, 07:43
|- - spf   Цитата(DASM @ Mar 31 2007, 10:43) да это ...   Mar 31 2007, 08:41
|- - DASM   Цитата(spf @ Mar 31 2007, 09:41) Это поня...   Mar 31 2007, 09:18
- - DASM   msr CPSR_c, r0 /* точка разрешения прерываний ...   Mar 30 2007, 23:41
- - Alex B._   >> В авторском варианте TNKernel вложенные п...   Mar 31 2007, 00:06
- - DASM   А я допишу пока для ясности.. "A когда задача...   Mar 31 2007, 00:08
|- - Сергей Борщ   Цитата(DASM @ Mar 30 2007, 23:08) Но пока...   Mar 31 2007, 01:05
|- - DASM   Цитата(Сергей Борщ @ Mar 31 2007, 02:05) ...   Mar 31 2007, 01:14
- - yuri_t   По материалам дискуссии буду делать v.2.4. Туда же...   Mar 31 2007, 09:30
|- - IgorKossak   Цитата(yuri_t @ Mar 31 2007, 09:30) По ма...   Apr 3 2007, 09:45
|- - zltigo   Цитата(IgorKossak @ Apr 3 2007, 08:45) А ...   Apr 3 2007, 10:11
|- - spf   Цитата(zltigo @ Apr 3 2007, 13:11) Я бы н...   Apr 4 2007, 07:03
|- - zltigo   Цитата(spf @ Apr 4 2007, 06:03) Приличная...   Apr 4 2007, 09:22
- - Alex B._   >> Существенное ограничение. Это затрудняет ...   Mar 31 2007, 09:55
|- - spf   Цитата(Alex B._ @ Mar 31 2007, 12:55) не ...   Mar 31 2007, 11:28
- - Alex B._   >> Противоречишь сам себе. Если бы было без ...   Mar 31 2007, 11:48
|- - spf   Цитата(Alex B._ @ Mar 31 2007, 14:48) Про...   Mar 31 2007, 12:26
- - DASM   Господа, а не пойти ли вам в другую ветку ? Я серь...   Mar 31 2007, 16:32
|- - zltigo   Цитата(DASM @ Mar 31 2007, 15:32) Бегло о...   Mar 31 2007, 21:30
- - yuri_t   Дело в том, что ситуация, когда OS не может полнос...   Mar 31 2007, 19:02
|- - zltigo   Цитата(yuri_t @ Mar 31 2007, 18:02) Дело ...   Mar 31 2007, 19:30
- - yuri_t   ЦитатаПосмотрел - нет. Там везде такое: LDMFD S...   Mar 31 2007, 22:32
- - IgorKossak   zltigo, ну если цена высока, то может и не надо. С...   Apr 3 2007, 15:16
|- - zltigo   Цитата(IgorKossak @ Apr 3 2007, 14:16) С ...   Apr 3 2007, 19:20
- - prottoss   Привет всем! Начал разбираться с TNKernel. Поч...   Mar 25 2008, 14:14
|- - prottoss   Цитата(prottoss @ Mar 25 2008, 21:14) ра...   Mar 25 2008, 18:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th August 2025 - 06:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016