2020-09-03 11:13:37 +02:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include "platform.h"
|
|
|
|
#include "encoding.h"
|
|
|
|
|
2020-09-04 12:56:12 +02:00
|
|
|
#define IOF_ENABLE_TERMINAL (0x30000)
|
2020-09-03 11:13:37 +02:00
|
|
|
int factorial(int i){
|
|
|
|
|
|
|
|
volatile int result = 1;
|
|
|
|
for (int ii = 1; ii <= i; ii++) {
|
|
|
|
result = result * ii;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-09-04 12:56:12 +02:00
|
|
|
int main()
|
|
|
|
{
|
|
|
|
GPIO_REG(GPIO_IOF_EN) |= IOF_ENABLE_TERMINAL; // enable GPIO connection to the terminal
|
2020-09-03 11:13:37 +02:00
|
|
|
|
2020-09-04 12:56:12 +02:00
|
|
|
int hartid = read_csr(0xf14); // CSR_MHARTID
|
|
|
|
int target_mem_base = 0x90000000;
|
|
|
|
int local_mem_base = 0x80000000;
|
2020-09-03 11:13:37 +02:00
|
|
|
|
2020-09-04 12:56:12 +02:00
|
|
|
if (hartid == 0) {
|
|
|
|
int val_a = 2;
|
|
|
|
int val_b = 3;
|
|
|
|
*(int *)target_mem_base = val_a;
|
|
|
|
*(int *)(target_mem_base+4) = val_b;
|
|
|
|
printf("HW thread ID %d: write value A=%x and value B=%x to thread 1\n", hartid, val_a, val_b);
|
|
|
|
}
|
2020-09-03 11:13:37 +02:00
|
|
|
|
|
|
|
|
2020-09-04 12:56:12 +02:00
|
|
|
int result = factorial (10);
|
|
|
|
printf("HW thread ID %d: spend some time calculating factorial of 10 = %x\n", hartid, result);
|
2020-09-03 11:13:37 +02:00
|
|
|
|
2020-09-04 12:56:12 +02:00
|
|
|
if (hartid == 1) {
|
|
|
|
int val_a = *(int *)local_mem_base;
|
|
|
|
int val_b = *(int *)(local_mem_base+4);
|
|
|
|
int sum = val_a + val_b;
|
|
|
|
printf("HW thread ID %d: sum of A+B=%x \n", hartid, sum);
|
|
|
|
}
|
2020-09-03 11:13:37 +02:00
|
|
|
|
|
|
|
printf("End of execution");
|
|
|
|
return 0;
|
|
|
|
}
|