初始版本
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
#ifndef PT_TASK_H
|
||||
#define PT_TASK_H
|
||||
|
||||
#include "pt.h"
|
||||
|
||||
#include "pt_sem.h"
|
||||
|
||||
#include "pt_ext.h"
|
||||
|
||||
#include "pt_pm.h"
|
||||
|
||||
/*
|
||||
* Structure for registered entries
|
||||
* Contains the name, protothread control structure, and function pointers
|
||||
* for initialization and entry functions.
|
||||
*/
|
||||
typedef struct pt pt_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char name[24]; /* Entry name */
|
||||
pt_t* pt; /* Protothread control structure */
|
||||
int status;
|
||||
int (*fn_entry)(pt_t *pt); /* Function pointer */
|
||||
} pt_task_t;
|
||||
|
||||
|
||||
/*
|
||||
* Register a scheduling entry function
|
||||
* \param obj_name Unique identifier for the entry (max 7 chars)
|
||||
* \param pt_ptr Protothread control structure pointer
|
||||
* \param entry_func Entry point function (int (*)(pt_t *))
|
||||
*/
|
||||
/*
|
||||
* Register a scheduling entry function
|
||||
* @param obj_name Unique identifier for the entry (max 7 chars)
|
||||
* @param pt_ptr Protothread control structure pointer
|
||||
* @param init_func Initialization function (int (*)(pt_t *))
|
||||
* @param entry_func Entry point function (int (*)(pt_t *))
|
||||
*/
|
||||
#define PT_TASK_OBJ(obj_name) _pt_task_object_##obj_name
|
||||
|
||||
//#define PT_TASK_OBJ_DECL(obj_name) pt_task_t PT_TASK_OBJ(obj_name)
|
||||
|
||||
|
||||
/*
|
||||
* Specific section boundary accessors for PT_SCHEDULE_SECTION
|
||||
*/
|
||||
#ifdef __CC_ARM
|
||||
/* MDK ARM Compiler specific macros for PT_SCHEDULE_SECTION */
|
||||
#define PT_TASK_OBJ_START ((uint32_t)&PT_TASK_OBJ(start))
|
||||
#define PT_TASK_OBJ_END ((uint32_t)&PT_TASK_OBJ(end))
|
||||
#elif defined(__GNUC__)
|
||||
extern char __start_PT_SCHEDULE[];
|
||||
extern char __stop_PT_SCHEDULE[];
|
||||
#define PT_SCHEDULE_START (uint32_t)__start_PT_SCHEDULE
|
||||
#define PT_SCHEDULE_END (uint32_t)__stop_PT_SCHEDULE
|
||||
#endif
|
||||
|
||||
|
||||
#define PT_TASK_DECL(obj_name,level,entry_func) \
|
||||
static pt_t _pt_object_##obj_name; \
|
||||
static pt_task_t _pt_task_object_##obj_name\
|
||||
__attribute__((section("task._pt_obj_"#level), used)) = { \
|
||||
.name = #obj_name, \
|
||||
.pt = &(_pt_object_##obj_name), \
|
||||
.fn_entry =(entry_func) \
|
||||
}
|
||||
|
||||
|
||||
#define PT_TASK_START(entry_func) PT_TASK_DECL(start,"00",entry_func)
|
||||
|
||||
#define PT_TASK_BOARD_REG(entry_func) PT_TASK_DECL(entry_func,"01",entry_func)
|
||||
|
||||
#define PT_TASK_DRIVER_REG(entry_func) PT_TASK_DECL(entry_func,"02",entry_func)
|
||||
|
||||
#define PT_TASK_DEVICE_REG(entry_func) PT_TASK_DECL(entry_func,"03",entry_func)
|
||||
|
||||
#define PT_TASK_COMPONENT_REG(entry_func) PT_TASK_DECL(entry_func,"04",entry_func)
|
||||
|
||||
#define PT_TASK_THID_REG(entry_func) PT_TASK_DECL(entry_func,"05",entry_func)
|
||||
|
||||
#define PT_TASK_APP_REG(entry_func) PT_TASK_DECL(entry_func,"06",entry_func)
|
||||
|
||||
#define PT_TASK_END(entry_func) PT_TASK_DECL(end,"99",entry_func)
|
||||
|
||||
/*
|
||||
* Prototypes for auto management functions
|
||||
*/
|
||||
void pt_task_init(void);
|
||||
|
||||
void pt_task_schedule(void);
|
||||
|
||||
bool pt_task_is_active(pt_task_t *task);
|
||||
|
||||
bool pt_task_all_idle(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user