2020-12-22 00:03:08 +01:00
|
|
|
open Names
|
|
|
|
open C
|
|
|
|
open Obc
|
|
|
|
open Async_backend
|
|
|
|
|
2020-12-22 21:30:04 +01:00
|
|
|
module AvrBackend : AsyncBackend =
|
2020-12-22 00:03:08 +01:00
|
|
|
struct
|
|
|
|
let qn_append q suffix =
|
|
|
|
{ qual = q.qual; name = q.name ^ suffix }
|
|
|
|
|
|
|
|
(* FIXME(Arduino): don't do a shallow copy *)
|
|
|
|
(* FIXME(Arduino): add a mutex… *)
|
|
|
|
let gen_copy_func cd suffix =
|
|
|
|
let func_name = (cname_of_qn cd.cd_name) ^ "_copy" ^ suffix in
|
|
|
|
(* TODO(Arduino): add const qualifier *)
|
|
|
|
let arg_ty = Cty_ptr (Cty_id (qn_append cd.cd_name suffix)) in
|
|
|
|
let sizeof = Cfun_call ("sizeof", [Cderef (Cvar "src")]) in
|
2020-12-22 21:30:04 +01:00
|
|
|
let memcpy =
|
|
|
|
Cfun_call ("atomic_memcpy", [Cvar "dest"; Cvar "src"; sizeof])
|
|
|
|
in
|
2020-12-22 00:03:08 +01:00
|
|
|
Cfundef {
|
|
|
|
C.f_name = func_name;
|
|
|
|
f_retty = Cty_void;
|
|
|
|
f_args = [("dest", arg_ty); ("src", arg_ty)];
|
|
|
|
f_body = {
|
|
|
|
var_decls = [];
|
|
|
|
block_body = [Csexpr memcpy] }
|
|
|
|
}
|
|
|
|
|
|
|
|
let gen_copy_func_in cd = gen_copy_func cd "_in"
|
|
|
|
|
|
|
|
let gen_copy_func_out cd = gen_copy_func cd "_out"
|
|
|
|
|
2020-12-25 15:03:19 +01:00
|
|
|
let includes = ["avr"]
|
|
|
|
|
|
|
|
let decls_and_defs classes =
|
|
|
|
(* run_timers is declared in avr.h (because of the ISR macro which
|
|
|
|
* I don't know how to generate here) *)
|
|
|
|
let defs = [
|
|
|
|
Cfundef {
|
|
|
|
C.f_name = "run_timers";
|
|
|
|
f_retty = Cty_void;
|
|
|
|
f_args = [];
|
|
|
|
f_body = {
|
|
|
|
var_decls = [];
|
|
|
|
block_body = []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
] in
|
|
|
|
[], defs
|
|
|
|
|
2020-12-22 00:03:08 +01:00
|
|
|
end
|