feat: add lab-rv32i-freertos-task-wrapper card
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
#ifndef K07_HOST_FREERTOS_H
|
||||
#define K07_HOST_FREERTOS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef int32_t BaseType_t;
|
||||
typedef uint32_t UBaseType_t;
|
||||
typedef uint32_t configSTACK_DEPTH_TYPE;
|
||||
typedef void * TaskHandle_t;
|
||||
|
||||
#define pdPASS ( ( BaseType_t ) 1 )
|
||||
#define pdFAIL ( ( BaseType_t ) 0 )
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
#ifndef K07_HOST_TASK_H
|
||||
#define K07_HOST_TASK_H
|
||||
|
||||
#include "FreeRTOS.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void ( * TaskFunction_t )( void * );
|
||||
BaseType_t xTaskCreate( TaskFunction_t entry,
|
||||
const char * name,
|
||||
configSTACK_DEPTH_TYPE stack_words,
|
||||
void * context,
|
||||
UBaseType_t priority,
|
||||
TaskHandle_t * handle );
|
||||
void vTaskDelete( TaskHandle_t handle );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
|
||||
#include "freertos/task.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
size_t create_calls;
|
||||
TaskFunction_t captured_entry;
|
||||
void * captured_context;
|
||||
int fake_tcb;
|
||||
|
||||
class ProbeTask final : public freertos::Task< ProbeTask >
|
||||
{
|
||||
friend class freertos::Task< ProbeTask >;
|
||||
|
||||
public:
|
||||
explicit constexpr ProbeTask( const char * name ) noexcept
|
||||
: Task { name, 128U, 2U }
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
void run() noexcept
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
extern "C" BaseType_t xTaskCreate( TaskFunction_t entry,
|
||||
const char * name,
|
||||
configSTACK_DEPTH_TYPE,
|
||||
void * context,
|
||||
UBaseType_t,
|
||||
TaskHandle_t * handle )
|
||||
{
|
||||
++create_calls;
|
||||
captured_entry = entry;
|
||||
captured_context = context;
|
||||
if( name[ 0 ] == 'f' && name[ 1 ] == 'a' &&
|
||||
name[ 2 ] == 'i' && name[ 3 ] == 'l' && name[ 4 ] == '\0' )
|
||||
{
|
||||
return pdFAIL;
|
||||
}
|
||||
*handle = &fake_tcb;
|
||||
return pdPASS;
|
||||
}
|
||||
|
||||
extern "C" void vTaskDelete( TaskHandle_t )
|
||||
{
|
||||
}
|
||||
|
||||
static_assert( !std::is_copy_constructible< ProbeTask >::value );
|
||||
static_assert( !std::is_move_constructible< ProbeTask >::value );
|
||||
static_assert( !std::is_polymorphic< ProbeTask >::value );
|
||||
|
||||
int main()
|
||||
{
|
||||
ProbeTask task { "probe" };
|
||||
assert( create_calls == 0U );
|
||||
assert( task.state() == freertos::TaskState::constructed );
|
||||
assert( task.native_handle() == nullptr );
|
||||
|
||||
assert( task.start() );
|
||||
assert( create_calls == 1U );
|
||||
assert( captured_entry != nullptr );
|
||||
assert( captured_context == &task );
|
||||
assert( task.native_handle() == &fake_tcb );
|
||||
assert( task.state() == freertos::TaskState::ready );
|
||||
assert( !task.start() );
|
||||
assert( create_calls == 1U );
|
||||
|
||||
ProbeTask failed { "fail" };
|
||||
assert( !failed.start() );
|
||||
assert( failed.state() == freertos::TaskState::start_failed );
|
||||
assert( failed.native_handle() == nullptr );
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user