任务优先级,数值越小优先级越高
void tx_application_define(void *first_unused_memory)
@ /* The following is the idle wait processing... in this case, no threads are ready for execution and the
@ system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts
@ are disabled to allow use of WFI for waiting for a thread to arrive. */
@
__tx_ts_wait:CPSID i @ Disable interruptsLDR r1, [r2] @ Pickup the next thread to execute pointerSTR r1, [r0] @ Store it in the current pointerCBNZ r1, __tx_ts_ready @ If non-NULL, a new thread is ready!
没有任务时ThreadX都在这里执行死循环。
/* User_heap_stack section, used to check that there is enough RAM left */._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);__RAM_segment_used_end__ = .;} >RAM
在Threadx移植文件下ports/cortex_m4/gnu/src/tx_initialize_low_level.s中定义:
SYSTEM_CLOCK = 180000000
SYSTICK_CYCLES = ((SYSTEM_CLOCK / 1000) -1)
#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save;#define TX_DISABLE interrupt_save = __disable_interrupts();
#define TX_RESTORE __restore_interrupts(interrupt_save);
使用方法:
TX_INTERRUPT_SAVE_AREA TX_DISABLE
xxx 临界段
TX_RESTORE
一般RTOS任务锁实现有两种方法:
但ThreadX有更好的实现方式:抢占阈值
。抢占阈值
是ThreadX独有的高级功能。
比如一个任务的优先级是 5,我们希望执行某代码期间禁止优先级 0-4 的任务抢占:
TX_THREAD my_thread;
UINT my_old_threshold;
UINT status; status = tx_thread_preemption_change(&my_thread, 0, &my_old_threshold); 用户可以在此处执行关键代码。 status = tx_thread_preemption_change(&my_thread, 5, &my_old_threshold);
ThreadX支持动态加载App执行,类似安卓App
ThreadX动态APP玩法调用主程序的API也很方便,这样APP就可以仅写应用代码即可,驱动之类的都在主程序实现:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112170&highlight=threadx
相对延时:
tx_thread_sleep(100);
通过相对延时延时实现绝对延时:
static void TaskFunc(ULONG thread_input)
{ UINT delay, nextTime; const UINT frequency = 200; /* 获取 frequency 个时钟节拍后的时间 */ nextTime= tx_time_get() + frequency; while(1) { LedToggle(); delay = nextTime - tx_time_get(); nextTime += frequency ; if(delay <= frequency) { tx_thread_sleep(delay); } }
}