⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tx_el.h

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 H
📖 第 1 页 / 共 3 页
字号:
#define TX_EL_END_FILTER
#endif

/* Define externs and constants for non-event log source modules.  This is for
   the in-line macros below.  */

#ifndef TX_EL_SOURCE_CODE
extern UCHAR            *_tx_el_tni_start;
extern UCHAR            **_tx_el_current_event;
extern UCHAR            *_tx_el_event_area_start;
extern UCHAR            *_tx_el_event_area_end;
extern UINT             _tx_el_maximum_events;
extern ULONG            _tx_el_total_events;
extern TX_THREAD        *_tx_thread_current_ptr;
extern UINT             _tx_el_event_filter;
extern ULONG            _tx_el_time_lower;
extern ULONG            _tx_el_time_upper;
extern ULONG            _tx_el_time_lower_temp;
extern ULONG            _tx_el_skip_update;


/* Define macros for event logging functions.  */

#define TX_EL_THREAD_CREATE_INSERT              TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO4(TX_EL_THREAD_CREATE, thread_ptr, stack_start, stack_size, priority); TX_EL_END_FILTER
#define TX_EL_EVENT_FLAGS_SET_INSERT            TX_EL_NO_EVENT_FLAG_EVENTS  TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_EVENT_FLAGS_SET, group_ptr, flags_to_set, set_option); TX_EL_END_FILTER
#define TX_EL_THREAD_DELETE_INSERT              TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_THREAD_DELETE, thread_ptr); TX_EL_END_FILTER
#define TX_EL_THREAD_TIME_SLICE_CHANGE_INSERT   TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_THREAD_TIME_SLICE_CHANGE, thread_ptr, thread_ptr -> tx_new_time_slice, new_time_slice); TX_EL_END_FILTER
#define TX_EL_THREAD_TERMINATE_INSERT           TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_THREAD_TERMINATE, thread_ptr); TX_EL_END_FILTER
#define TX_EL_THREAD_SLEEP_INSERT               TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_THREAD_SLEEP, timer_ticks); TX_EL_END_FILTER
#define TX_EL_THREAD_SUSPEND_INSERT             TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_THREAD_SUSPEND, thread_ptr); TX_EL_END_FILTER
#define TX_EL_THREAD_RELINQUISH_INSERT          TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO0(TX_EL_THREAD_RELINQUISH); TX_EL_END_FILTER
#define TX_EL_THREAD_RESUME_INSERT              TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_THREAD_RESUME, thread_ptr); TX_EL_END_FILTER
#define TX_EL_THREAD_PRIORITY_CHANGE_INSERT     TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_THREAD_PRIORITY_CHANGE, thread_ptr, thread_ptr -> tx_priority, new_priority); TX_EL_END_FILTER
#define TX_EL_THREAD_PREEMPTION_CHANGE_INSERT   TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_THREAD_PREEMPTION_CHANGE, thread_ptr, thread_ptr -> tx_preempt_threshold, new_threshold); TX_EL_END_FILTER
#define TX_EL_TIME_SET_INSERT                   TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_TIME_SET, new_time); TX_EL_END_FILTER
#define TX_EL_TIME_GET_INSERT                   TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_TIME_GET, _tx_timer_system_clock); TX_EL_END_FILTER
#define TX_EL_TIMER_DELETE_INSERT               TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_TIMER_DELETE, timer_ptr); TX_EL_END_FILTER
#define TX_EL_TIMER_CREATE_INSERT               TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO4(TX_EL_TIMER_CREATE, timer_ptr, initial_ticks, reschedule_ticks, auto_activate); TX_EL_END_FILTER
#define TX_EL_TIMER_CHANGE_INSERT               TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_TIMER_CHANGE, timer_ptr, initial_ticks, reschedule_ticks); TX_EL_END_FILTER
#define TX_EL_THREAD_IDENTIFY_INSERT            TX_EL_NO_THREAD_EVENTS      TX_EL_KERNEL_CALL_EVENT_INSERT_INFO0(TX_EL_THREAD_IDENTIFY); TX_EL_END_FILTER
#define TX_EL_TIMER_DEACTIVATE_INSERT           TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_TIMER_DEACTIVATE, timer_ptr); TX_EL_END_FILTER
#define TX_EL_TIMER_ACTIVATE_INSERT             TX_EL_NO_TIMER_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_TIMER_ACTIVATE, timer_ptr); TX_EL_END_FILTER
#define TX_EL_SEMAPHORE_PUT_INSERT              TX_EL_NO_SEMAPHORE_EVENTS   TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_SEMAPHORE_PUT, semaphore_ptr, semaphore_ptr -> tx_semaphore_count); TX_EL_END_FILTER
#define TX_EL_SEMAPHORE_GET_INSERT              TX_EL_NO_SEMAPHORE_EVENTS   TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_SEMAPHORE_GET, semaphore_ptr, semaphore_ptr -> tx_semaphore_count); TX_EL_END_FILTER
#define TX_EL_SEMAPHORE_DELETE_INSERT           TX_EL_NO_SEMAPHORE_EVENTS   TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_SEMAPHORE_DELETE, semaphore_ptr); TX_EL_END_FILTER
#define TX_EL_SEMAPHORE_CREATE_INSERT           TX_EL_NO_SEMAPHORE_EVENTS   TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_SEMAPHORE_CREATE, semaphore_ptr, initial_count); TX_EL_END_FILTER
#define TX_EL_QUEUE_SEND_INSERT                 TX_EL_NO_QUEUE_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_QUEUE_SEND, queue_ptr, source_ptr); TX_EL_END_FILTER
#define TX_EL_QUEUE_RECEIVE_INSERT              TX_EL_NO_QUEUE_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_QUEUE_RECEIVE, queue_ptr, destination_ptr); TX_EL_END_FILTER
#define TX_EL_QUEUE_FLUSH_INSERT                TX_EL_NO_QUEUE_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_QUEUE_FLUSH, queue_ptr); TX_EL_END_FILTER
#define TX_EL_QUEUE_DELETE_INSERT               TX_EL_NO_QUEUE_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_QUEUE_DELETE, queue_ptr); TX_EL_END_FILTER
#define TX_EL_QUEUE_CREATE_INSERT               TX_EL_NO_QUEUE_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO4(TX_EL_QUEUE_CREATE, queue_ptr, queue_start, queue_size, message_size); TX_EL_END_FILTER
#define TX_EL_EVENT_FLAGS_GET_INSERT            TX_EL_NO_EVENT_FLAG_EVENTS  TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_EVENT_FLAGS_GET, group_ptr, requested_flags, get_option); TX_EL_END_FILTER
#define TX_EL_EVENT_FLAGS_DELETE_INSERT         TX_EL_NO_EVENT_FLAG_EVENTS  TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_EVENT_FLAGS_DELETE, group_ptr); TX_EL_END_FILTER
#define TX_EL_EVENT_FLAGS_CREATE_INSERT         TX_EL_NO_EVENT_FLAG_EVENTS  TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_EVENT_FLAGS_CREATE, group_ptr); TX_EL_END_FILTER
#define TX_EL_BYTE_RELEASE_INSERT               TX_EL_NO_BYTE_EVENTS        TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_BYTE_RELEASE, pool_ptr, memory_ptr); TX_EL_END_FILTER
#define TX_EL_BYTE_POOL_DELETE_INSERT           TX_EL_NO_BYTE_EVENTS        TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_BYTE_POOL_DELETE, pool_ptr); TX_EL_END_FILTER
#define TX_EL_BYTE_POOL_CREATE_INSERT           TX_EL_NO_BYTE_EVENTS        TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_BYTE_POOL_CREATE, pool_ptr, pool_start, pool_size); TX_EL_END_FILTER
#define TX_EL_BYTE_ALLOCATE_INSERT              TX_EL_NO_BYTE_EVENTS        TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(TX_EL_BYTE_ALLOCATE, pool_ptr, memory_ptr, memory_size); TX_EL_END_FILTER
#define TX_EL_BLOCK_RELEASE_INSERT              TX_EL_NO_BLOCK_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_BLOCK_RELEASE, pool_ptr, block_ptr); TX_EL_END_FILTER
#define TX_EL_BLOCK_POOL_DELETE_INSERT          TX_EL_NO_BLOCK_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(TX_EL_BLOCK_POOL_DELETE, pool_ptr); TX_EL_END_FILTER
#define TX_EL_BLOCK_POOL_CREATE_INSERT          TX_EL_NO_BLOCK_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO4(TX_EL_BLOCK_POOL_CREATE, pool_ptr, pool_start, pool_size, block_size); TX_EL_END_FILTER
#define TX_EL_BLOCK_ALLOCATE_INSERT             TX_EL_NO_BLOCK_EVENTS       TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(TX_EL_BLOCK_ALLOCATE, pool_ptr, block_ptr); TX_EL_END_FILTER

#endif


asm long read_time(void)
{
%
    LDR r1,=0xFFFE0010
    LDR r0,[r1]
%error
}

#define TX_EL_TIME_CALCULATE \
                        { \
                            _tx_el_time_lower_temp =  _tx_el_time_lower + *((ULONG *) 0xFFFE0010); \
                            if ((*((ULONG *) 0xFFFE0020)) & 1) \
                            { \
                                _tx_el_time_lower =       _tx_el_time_lower + TX_EL_TICKS_PER_INTERRUPT; \
                                _tx_el_time_lower_temp =  _tx_el_time_lower + *((ULONG *) 0xFFFE0010); \
                                if (_tx_el_time_lower == 0) \
                                    _tx_el_time_upper++; \
                                _tx_el_skip_update = 1; \
                            } \
                        } 


/* Define Event Log function prototypes.  */

VOID        _tx_el_initialize(VOID);
UINT        _tx_el_thread_register(TX_THREAD *thread_ptr);
VOID        _tx_el_user_event_insert(UINT sub_type, ULONG info_1, ULONG info_2, 
                                                    ULONG info_3, ULONG info_4);
VOID        _tx_el_thread_running(TX_THREAD *thread_ptr);
VOID        _tx_el_thread_preempted(TX_THREAD *thread_ptr);
VOID        _tx_el_interrupt(UINT interrupt_number);
VOID        _tx_el_interrupt_end(UINT interrupt_number);
VOID        _tx_el_interrupt_control_call(void);
VOID        _tx_el_event_log_on(void);
VOID        _tx_el_event_log_off(void);
VOID        _tx_el_event_filter_set(UINT filter);


/* Define macros that are used inside the ThreadX source code.
   If event logging is disabled, these macros will be defined
   as white space.  */

#ifdef  TX_ENABLE_EVENT_LOGGING
#ifndef TX_NO_EVENT_INFO
#define TX_EL_KERNEL_CALL_EVENT_INSERT_INFO4(a, b, c, d, e)  \
                        {  \
                        UCHAR   *entry_ptr; \
                        entry_ptr =  *_tx_el_current_event; \
                        *((unsigned short *) entry_ptr) =  TX_EL_THREADX_CALL; \
                        *((unsigned short *) (entry_ptr + TX_EL_EVENT_SUBTYPE_OFFSET)) = (unsigned short) a; \
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_UPPER_OFFSET)) =\
                                (ULONG) _tx_el_time_upper;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010);\
                        if ((*((ULONG *) 0xFFFE0020)) & 1) \
                        {\
                            _tx_el_time_lower += TX_EL_TICKS_PER_INTERRUPT; \
                            *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010); \
                            if (_tx_el_time_lower == 0) \
                                _tx_el_time_upper++; \
                            _tx_el_skip_update = 1; \
                        }\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_THREAD_OFFSET)) =\
                                (ULONG) _tx_thread_current_ptr;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_1_OFFSET)) =\
                                (ULONG) b;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_2_OFFSET)) =\
                                (ULONG) c;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_3_OFFSET)) =\
                                (ULONG) d;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_4_OFFSET)) =\
                                (ULONG) e;\
                        entry_ptr =  entry_ptr + TX_EL_EVENT_SIZE;\
                        if (entry_ptr >= _tx_el_event_area_end) \
                        {\
                                entry_ptr =  _tx_el_event_area_start;\
                        }\
                        *_tx_el_current_event =  entry_ptr;\
                        }
#define TX_EL_KERNEL_CALL_EVENT_INSERT_INFO3(a, b, c, d) \
                        {  \
                        UCHAR   *entry_ptr; \
                        entry_ptr =  *_tx_el_current_event; \
                        *((unsigned short *) entry_ptr) =  TX_EL_THREADX_CALL; \
                        *((unsigned short *) (entry_ptr + TX_EL_EVENT_SUBTYPE_OFFSET)) = (unsigned short) a; \
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_UPPER_OFFSET)) =\
                                (ULONG) _tx_el_time_upper;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010);\
                        if ((*((ULONG *) 0xFFFE0020)) & 1) \
                        {\
                            _tx_el_time_lower += TX_EL_TICKS_PER_INTERRUPT; \
                            *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010); \
                            if (_tx_el_time_lower == 0) \
                                _tx_el_time_upper++; \
                            _tx_el_skip_update = 1; \
                        }\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_THREAD_OFFSET)) =\
                                (ULONG) _tx_thread_current_ptr;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_1_OFFSET)) =\
                                (ULONG) b;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_2_OFFSET)) =\
                                (ULONG) c;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_3_OFFSET)) =\
                                (ULONG) d;\
                        entry_ptr =  entry_ptr + TX_EL_EVENT_SIZE;\
                        if (entry_ptr >= _tx_el_event_area_end) \
                        {\
                                entry_ptr =  _tx_el_event_area_start;\
                        }\
                        *_tx_el_current_event =  entry_ptr;\
                        }
#define TX_EL_KERNEL_CALL_EVENT_INSERT_INFO2(a, b, c) \
                        {  \
                        UCHAR   *entry_ptr; \
                        entry_ptr =  *_tx_el_current_event; \
                        *((unsigned short *) entry_ptr) =  TX_EL_THREADX_CALL; \
                        *((unsigned short *) (entry_ptr + TX_EL_EVENT_SUBTYPE_OFFSET)) = (unsigned short) a; \
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_UPPER_OFFSET)) =\
                                (ULONG) _tx_el_time_upper;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010);\
                        if ((*((ULONG *) 0xFFFE0020)) & 1) \
                        {\
                            _tx_el_time_lower += TX_EL_TICKS_PER_INTERRUPT; \
                            *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010); \
                            if (_tx_el_time_lower == 0) \
                                _tx_el_time_upper++; \
                            _tx_el_skip_update = 1; \
                        }\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_THREAD_OFFSET)) =\
                                (ULONG) _tx_thread_current_ptr;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_1_OFFSET)) =\
                                (ULONG) b;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_2_OFFSET)) =\
                                (ULONG) c;\
                        entry_ptr =  entry_ptr + TX_EL_EVENT_SIZE;\
                        if (entry_ptr >= _tx_el_event_area_end) \
                        {\
                                entry_ptr =  _tx_el_event_area_start;\
                        }\
                        *_tx_el_current_event =  entry_ptr;\
                        }
#define TX_EL_KERNEL_CALL_EVENT_INSERT_INFO1(a, b) \
                        {  \
                        UCHAR   *entry_ptr; \
                        entry_ptr =  *_tx_el_current_event; \
                        *((unsigned short *) entry_ptr) =  TX_EL_THREADX_CALL; \
                        *((unsigned short *) (entry_ptr + TX_EL_EVENT_SUBTYPE_OFFSET)) = (unsigned short) a; \
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_UPPER_OFFSET)) =\
                                (ULONG) _tx_el_time_upper;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010);\
                        if ((*((ULONG *) 0xFFFE0020)) & 1) \
                        {\
                            _tx_el_time_lower += TX_EL_TICKS_PER_INTERRUPT; \
                            *((ULONG *) (entry_ptr + TX_EL_EVENT_TIME_LOWER_OFFSET)) =\
                                (ULONG) _tx_el_time_lower + *((ULONG *) 0xFFFE0010); \
                            if (_tx_el_time_lower == 0) \
                                _tx_el_time_upper++; \
                            _tx_el_skip_update = 1; \
                        }\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_THREAD_OFFSET)) =\
                                (ULONG) _tx_thread_current_ptr;\
                        *((ULONG *) (entry_ptr + TX_EL_EVENT_INFO_1_OFFSET)) =\
                                (ULONG) b;\
                        entry_ptr =  entry_ptr + TX_EL_EVENT_SIZE;\
                        if (entry_ptr >= _tx_el_event_area_end) \
                        {\
                                entry_ptr =  _tx_el_event_area_start;\
                        }\
                        *_tx_el_current_event =  entry_ptr;\
                        }
#define TX_EL_KERNEL_CALL_EVENT_INSERT_INFO0(a) \
                        {  \
                        UCHAR   *entry_ptr; \
                        entry_ptr =  *_tx_el_current_event; \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -