Add register_core1
This commit is contained in:
parent
2fa2a5bd57
commit
aeb2380869
|
@ -25,13 +25,15 @@
|
||||||
#include "syslog.h"
|
#include "syslog.h"
|
||||||
#include "uarths.h"
|
#include "uarths.h"
|
||||||
|
|
||||||
|
extern volatile uint64_t g_wake_up[2];
|
||||||
|
|
||||||
|
core_instance_t core1_instance;
|
||||||
|
|
||||||
volatile char * const ram = (volatile char*)RAM_BASE_ADDR;
|
volatile char * const ram = (volatile char*)RAM_BASE_ADDR;
|
||||||
|
|
||||||
extern char _heap_start[];
|
extern char _heap_start[];
|
||||||
extern char _heap_end[];
|
extern char _heap_end[];
|
||||||
|
|
||||||
extern volatile uint64_t g_wake_up[2];
|
|
||||||
|
|
||||||
void thread_entry(int core_id)
|
void thread_entry(int core_id)
|
||||||
{
|
{
|
||||||
while (!atomic_read(&g_wake_up[core_id]));
|
while (!atomic_read(&g_wake_up[core_id]));
|
||||||
|
@ -43,6 +45,16 @@ void core_enable(int core_id)
|
||||||
atomic_set(&g_wake_up[core_id], 1);
|
atomic_set(&g_wake_up[core_id], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int register_core1(core_function func, void *ctx)
|
||||||
|
{
|
||||||
|
if(func == NULL)
|
||||||
|
return -1;
|
||||||
|
core1_instance.callback = func;
|
||||||
|
core1_instance.ctx = ctx;
|
||||||
|
core_enable(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int __attribute__((weak)) os_entry(int core_id, int number_of_cores, int (*user_main)(int, char**))
|
int __attribute__((weak)) os_entry(int core_id, int number_of_cores, int (*user_main)(int, char**))
|
||||||
{
|
{
|
||||||
/* Call main if there is no OS */
|
/* Call main if there is no OS */
|
||||||
|
@ -68,19 +80,22 @@ void _init_bsp(int core_id, int number_of_cores)
|
||||||
/* Init libc array for C++ */
|
/* Init libc array for C++ */
|
||||||
__libc_init_array();
|
__libc_init_array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
if (core_id == 0)
|
||||||
|
{
|
||||||
|
core1_instance.callback = NULL;
|
||||||
|
core1_instance.ctx = NULL;
|
||||||
|
ret = os_entry(core_id, number_of_cores, main);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
thread_entry(core_id);
|
thread_entry(core_id);
|
||||||
|
if(core1_instance.callback == NULL)
|
||||||
|
asm volatile ("wfi");
|
||||||
|
else
|
||||||
|
ret = core1_instance.callback(core1_instance.ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (core_id == 0)
|
|
||||||
{
|
|
||||||
/* Enable Core 1 to run main */
|
|
||||||
core_enable(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = os_entry(core_id, number_of_cores, main);
|
|
||||||
|
|
||||||
exit(ret);
|
exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef _KENDRYTE_BSP_H
|
||||||
|
#define _KENDRYTE_BSP_H
|
||||||
|
#include "atomic.h"
|
||||||
|
#include "entry.h"
|
||||||
|
#include "sleep.h"
|
||||||
|
#include "encoding.h"
|
||||||
|
#endif
|
|
@ -23,6 +23,16 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef int (*core_function)(void *ctx);
|
||||||
|
|
||||||
|
typedef struct _core_instance_t
|
||||||
|
{
|
||||||
|
core_function callback;
|
||||||
|
void *ctx;
|
||||||
|
} core_instance_t;
|
||||||
|
|
||||||
|
int register_core1(core_function func, void *ctx);
|
||||||
|
|
||||||
static inline void init_lma(void)
|
static inline void init_lma(void)
|
||||||
{
|
{
|
||||||
extern unsigned int _data_lma;
|
extern unsigned int _data_lma;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "sleep.h"
|
#include "sleep.h"
|
||||||
#include "encoding.h"
|
#include "bsp.h"
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
uint64_t core_id = current_coreid();
|
uint64_t core_id = current_coreid();
|
||||||
|
|
Loading…
Reference in New Issue