Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Codesourcery отжигает
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
_Pasha
Привет.
arm-none-eabi-cpp из (Sourcery G++ Lite 2010.09-51) под линух

Оказывается, там не работает __LINE__
Встречались с такой бедой?
Или это только у меня такое?

MrYuran
Цитата(_Pasha @ Sep 24 2012, 14:29) *
Оказывается, там не работает __LINE__

Превед, protothreads ?
laughing.gif
_Pasha
Цитата(MrYuran @ Sep 24 2012, 13:33) *
Превед, protothreads ?
laughing.gif

Не, серьезно, изгнал фриртос из проекта, потому что он все-таки оказался слишком прост для оси, - и сразу легко все пишется, и помещается, и стека хватает, и успевает ... а тут - такое. sm.gif
Дык и обойти нельзя: ссылки назад на метки легко на инлайн-функции делаются, правда с варнингами. А вот ссылки вперед smile3046.gif фигушки!
_Pasha
Ха, дуристика!
__LINE__ без склейки работает на ура. Обошел проблему, если кому надо (фанатам прототредов sm.gif )
Код
typedef struct
{
    void *pc;
} tcb_t;
//тра-та-та
static inline __attribute__((always_inline)) TH_label(tcb_t *tcb)
{
  tcb->pc = &&label;
label:
;
}

std=-gnu99
Ну и не надо нам ваших макросов! Подумаешь...хитрогнутые
KRS
С таким вариантом и код должен быть гораздо эффективнее!!!
_Pasha
Цитата(KRS @ Sep 24 2012, 15:29) *
С таким вариантом и код должен быть гораздо эффективнее!!!

Мы все рано радуемся. Забылось про то, что такое yield(). А это - примерно
Код
pc = &&Label; return pt_YIELDING; Label:

Тут бубен не помогает. Разве что поиграться с циклом for() .

В качестве кандидата
Код
static inline __attribute__((always_inline)) void *TH_label_yield(tcb_t *pc, const void *label_ret)
{
    pc->pc = &&label;
    return label_ret;
    label:;
}
// заготовки такие:
#define THREAD_BEGIN if(my->tcb.pc != NULL) goto *my->tcb.pc;
#define THREAD_END _Y_i_e_l_d_: return 0; _H_a_l_t_: return 1;
#define yield() goto *TH_label_yield(&my->tcb, &&_Y_i_e_l_d_);

По идее должно работать, но пока проверить некогда.
Вечером отпишусь. Да и полный вариант приведу.
_Pasha
Не работает yield(). sad.gif
Получается после goto "dead code" который подчищает оптимизатор
smile3046.gif шож придумать?
_Pasha
CODE

#include <stddef.h>
#include <stdint.h>
typedef struct
{
void *pc;
uint_fast8_t lock;
} tcb_t;

static inline __attribute__((always_inline)) void *TH_label(void)
{
return &&label;
label:;
}

#define THREAD_DEF(proc,param_type) uint_fast8_t proc(param_type *my)
/*
Typical stackless thread solution
typedef struct
{
tcb_t tcb;
int local_param;
} func_param_t;
// Define thread function with 1 parameter
THREAD_DEF(func, func_param_t)
{
// the default parameter name is always "my"
// i.e. to access parameter type my->local_param

THREAD_BEGIN // starting bracket
// -------THIS IS A THREAD BODY --------
wait(can_read()); //thread blocks until can_read() != 0
if(calc_condition()) halt(); //thread returns 1 - meaning that it is may be halted by caller

too_long_calculation(); // if the time spent is too long then we need to relax the system
yield(0); // that is mean immediatedly return and continue execution
// at the next point after yield() during further call
if(need_restart()) restart(); // threads may be restarted at any point of execution

repeat // this is a pascal-like implementation of the yield-loops
do_something(); // first we do
do_something_else(); // something
until(end_doing()); // and then yield if condition is not "true" else we continue execution

wait(timer() > TIMEOUT); // the thread will block while condition is false

spawn(sub_thread, &sub_params); // the thread will block until sub_thread is halted
// ------------ END OF THREAD BODY -----------------
THREAD_END // ending bracket
}
*/

#define THREAD_BEGIN if(my->tcb.pc != NULL) goto *my->tcb.pc;
#define THREAD_END _Y_i_e_l_d_: return 0; _H_a_l_t_: return 1;

#define STR_CONCAT2(s1, s2) s1##s2
#define STR_CONCAT(s1, s2) STR_CONCAT2(s1, s2)

#define yield() do{my->tcb.pc = &&STR_CONCAT(label,__LINE__); goto_Y_i_e_l_d_;STR_CONCAT2(label,__LINE__):;}while(0);

#define halt() do{goto _H_a_l_t_;}while(0);
#define restart() do{my->tcb.pc=NULL; goto _Y_i_e_l_d_;}while(0);

#define repeat do{my->tcb.pc=TH_label();}while(0);
#define until(cond) do{if(!(cond)) goto _Y_i_e_l_d_;}while(0);
#define wait(condition) do{repeat until((condition));}while(0);
#define spawn(name,param) wait(name(param))


На АВР работает, на х86 работает тут - не работает smile3046.gif
scifi
Цитата(_Pasha @ Sep 24 2012, 14:29) *
arm-none-eabi-cpp из (Sourcery G++ Lite 2010.09-51) под линух

Вроде бы уже 2012 год на дворе. Не пробовали установить версию поновее? Авось пофиксили.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.