From 78b34dd5ddd3a9c103b953f26322cdc32f128ed5 Mon Sep 17 00:00:00 2001 From: Thorsten Knoll Date: Wed, 27 Jan 2021 14:18:53 +0100 Subject: [PATCH] working c for ulx3s and sim --- c_project/hal-vexriscv.o | Bin 9756 -> 10060 bytes c_project/hal.o | Bin 13444 -> 5760 bytes c_project/libpqvexriscvsimbsp.a | Bin 3644 -> 3726 bytes c_project/main | Bin 46028 -> 0 bytes c_project/main.bin | Bin 7048 -> 0 bytes c_project/main.c | 16 +- c_project/main.hex | 446 -------- c_project/main.o | Bin 6256 -> 5652 bytes c_project/memcmp.o | Bin 4932 -> 4984 bytes c_project/memcpy.o | Bin 17800 -> 15680 bytes c_project/memset.o | Bin 12844 -> 5176 bytes c_project/pqvexriscvsim.ld | 8 +- c_project/printf.o | Bin 122220 -> 128024 bytes c_project/vexriscv/init.c | 5 - c_project/vexriscv/pqvexriscvsim.ld | 4 +- c_project/vexriscv/pqvexriscvsim_init.o | Bin 880 -> 756 bytes c_project/vexriscv/pqvexriscvsim_start.o | Bin 2360 -> 2576 bytes c_project/vexriscv/start.S | 10 +- c_project/vexriscv/volatile-split.ld | 137 +++ c_project/volatile-split.ld | 137 +++ c_project_sim_and_ulx3s/bsp/vexriscv/Makefile | 54 + c_project_sim_and_ulx3s/bsp/vexriscv/init.c | 8 + .../bsp/vexriscv/libpqvexriscvup5kbsp.a | Bin 0 -> 3348 bytes c_project_sim_and_ulx3s/bsp/vexriscv/main.c | 29 + c_project_sim_and_ulx3s/bsp/vexriscv/murax.ld | 11 + .../bsp/vexriscv/nonvolatile.ld | 141 +++ .../bsp/vexriscv/pqvexriscvicoboard.ld | 11 + .../bsp/vexriscv/pqvexriscvsim.ld | 14 + .../bsp/vexriscv/pqvexriscvsimhuge.ld | 14 + .../bsp/vexriscv/pqvexriscvup5k.ld | 14 + .../bsp/vexriscv/pqvexriscvup5k_init.o | Bin 0 -> 756 bytes .../bsp/vexriscv/pqvexriscvup5k_start.o | Bin 0 -> 2196 bytes c_project_sim_and_ulx3s/bsp/vexriscv/start.S | 156 +++ .../bsp/vexriscv/volatile-split.ld | 137 +++ .../bsp/vexriscv/volatile.ld | 137 +++ .../bsp/vexriscv/weak_under_alias.h | 7 + c_project_sim_and_ulx3s/compile_command.txt | 1 + c_project_sim_and_ulx3s/hal-vexriscv.c | 60 ++ c_project_sim_and_ulx3s/hal.c | 21 + c_project_sim_and_ulx3s/hal.h | 18 + .../libpqvexriscvup5kbsp.a | Bin 0 -> 3348 bytes c_project_sim_and_ulx3s/main.c | 29 + c_project_sim_and_ulx3s/main.d | 6 + c_project_sim_and_ulx3s/main.elf | Bin 0 -> 41844 bytes c_project_sim_and_ulx3s/memcmp.c | 16 + c_project_sim_and_ulx3s/memcpy.c | 61 ++ c_project_sim_and_ulx3s/memset.c | 64 ++ c_project_sim_and_ulx3s/pqvexriscvup5k.ld | 14 + c_project_sim_and_ulx3s/printf.c | 987 ++++++++++++++++++ c_project_sim_and_ulx3s/printf.h | 121 +++ c_project_sim_and_ulx3s/volatile-split.ld | 137 +++ 51 files changed, 2557 insertions(+), 474 deletions(-) delete mode 100755 c_project/main delete mode 100755 c_project/main.bin delete mode 100644 c_project/main.hex create mode 100644 c_project/vexriscv/volatile-split.ld create mode 100644 c_project/volatile-split.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/Makefile create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/init.c create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/libpqvexriscvup5kbsp.a create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/main.c create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/murax.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/nonvolatile.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvicoboard.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsim.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsimhuge.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k_init.o create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k_start.o create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/start.S create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/volatile-split.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/volatile.ld create mode 100644 c_project_sim_and_ulx3s/bsp/vexriscv/weak_under_alias.h create mode 100644 c_project_sim_and_ulx3s/compile_command.txt create mode 100644 c_project_sim_and_ulx3s/hal-vexriscv.c create mode 100644 c_project_sim_and_ulx3s/hal.c create mode 100644 c_project_sim_and_ulx3s/hal.h create mode 100644 c_project_sim_and_ulx3s/libpqvexriscvup5kbsp.a create mode 100644 c_project_sim_and_ulx3s/main.c create mode 100644 c_project_sim_and_ulx3s/main.d create mode 100755 c_project_sim_and_ulx3s/main.elf create mode 100644 c_project_sim_and_ulx3s/memcmp.c create mode 100644 c_project_sim_and_ulx3s/memcpy.c create mode 100644 c_project_sim_and_ulx3s/memset.c create mode 100644 c_project_sim_and_ulx3s/pqvexriscvup5k.ld create mode 100644 c_project_sim_and_ulx3s/printf.c create mode 100644 c_project_sim_and_ulx3s/printf.h create mode 100644 c_project_sim_and_ulx3s/volatile-split.ld diff --git a/c_project/hal-vexriscv.o b/c_project/hal-vexriscv.o index 9ecd27908eb6f0021440ca78924eac0aabaea5bc..389a3add9feb37644dfe1fa332088de93f943619 100644 GIT binary patch delta 3594 zcmZXWYiv|S6vt_wH|g=ghr# z?>u(TF1fL+Kju5B1`?a|k1i+`C4tg`6U*hT!Mou=e!EWyzxc)c5opY-tF5Uw)xmFM znRyVLUR2=E6bK;$e*Zr6aehN-RnQ;wM44Z3BIp;UB|qU0(dYjB^nZHH8*vb2exFwy z3i`cfKnBg@{8?r}Xnd%nbw|stE#2+rv(RbN6KXU~1&c#Fc6M)zb$0ieyuw7ddD-gN z+`4Ho@6k>d)RcGi?e5+(vv+6P_APy}iCwL|Z5=av_e`$u>@wF1=8X}}bLY;8jiqkm zygoIxA}oY>OyM`Jg$>ChwR$^uwe1nIoG>pE@Oszx)V6fdNrYr!kr@b-m>Y$sOsptk zHWh6$hv@Ta(TX@ab4U>(_+Q&Z!x>W>j+p-N3UeVGxp+T(U&cR>u3JRRCA{mJbdklx zznh|Ww8OkHtRbZ<`I_sAYIt;JPxgE?GWRd*n##~^V}PVFUXpU=r(CEjjs zQLigG_73rPIqmzz+j6e*fZ8)mJW>_Kb92xar;0UZWu$7@87JwRj3hfC&5_7W-%?># zMQ=tI=49_tR++kCKgs09Xi2+2Gn`%sxtXe{DH1%0Szvz)d*jv9;*#Y8&f5)Z{}@KR=6TP|b9hg{CQ z8oYw}1@KDd4)7|G@mf34c#ac$z|S*dWF@XZafA-J#zTQQBG)pX2IF;5oTEdo_fUKa z#vLgx(;;8 zwq!YN{T$S6C6DjF2#sxAv=kliZYaQM>o=pOlRegge3|(G>bGY(ZM{JaCI-bBaF-CZ z#OJ`>o)&||8HsmKaS4eY<}1YNl`N;NzlEA!_P>F5F+V_kUzXF>|B0I2>>qM*Pj)6vf*W)iC-&_aNn zpGWLG*!hLJ2(k zfSrGb*m) z39z;`74Q?d9;|JRhOcH1*0yF6{6zaM(a^T20f`#!0M-+kXTeX(vbHtN@K{O|U~Oww zz}K+{Yg@Ax9!rd3t&cV;ZHrovc#0EXZHwCAXR!xsTZ1Vno7iLG$N;mqSB%bb+IkF! ztH;ZfD4b6RzPPHV69qVp1O@KzI$-U~$*{cM)zmDfCto}spDKNk5$5Z}hrad^W~18U z>nS%ssAckkNhO!d`(}4?g6uFKB~?(+B&^Oe*OQ6Ba@qvy&7-6W9Hxa`Vn(HuJY{C4 v(!T11*_zUU?@6c3KuQhyo9Gbj3RqI7&9&5M-~Qp|9+g~42=T4CR#@^cFT7y% delta 3332 zcmYk8TWnNC7{_OJ+3lU~wzP5)_UsNjTcF*xK%ix@REi)11w?L&0tJL>DHN~@3R}Pn zib3ii@__n45FbpmAt7LRfars_5b6^|Barw&AR%I+5JQ6B|9msOZ(pUK#kcG*nO@5F#jUm^-0Nuqi#s)P=t__rnu| z!Qd`)wV;VU!)9MW!hBhfux?hBC=x;j_n-|G2K_7~&E&$C!mcgd8@25&qO_S&Jkxw%6whp0+qHW8hVJ!3%xPG z!J`DF>4v(A4UNs|hNg7GI2NK*2=S0Ynoo+GN7h~g^6VAjp?P<>PWi^X{3hjX z=3*okolnFOp&1aO-`tJFDt>X2o_RRgV8A4zmja~$^H=mzba7tq@6=ms1}m<~n$rW7 z>x0>8-1#VdL^8}Z;OWeh!H+RN32tFtk;h%&e)eJdkTaMuTe6io3Vxiq3OtiJI|2!2 zgJLvYYL<^ar>u{Yl25R&1J7n|1DJUT@M_&H_|yo$LN{5JJ^Gr zkHh1nq5wOeBv!j%g#bI>Osrmq6`~pUcOBT~>J4Ziz|PMib{_0JcAJ|fu=7}}?gn7z zvG&~G0mJ*>AM3<*fZYI0yTTr%06UL2>pa+bd?~eu8Va!U?-4r>cAgIMtWb6eDEYqw z`&ji+LjiUJP7%8sgPlJE-$xAv*!gdWT|LDhXN~twF+`Hbs{xzFF=}%aOfeg2xf}*RpA=vnVO|YiVcEoEs;mbFtAL`%ERLz{ zUYKe&U|q$00DeS{wXHb}KaxFI+nS^Bqu7JBt@#Wd(@X)@w&oQ4Xx`iciMB;wp<@gW z0PE4rIQ+~;$H)8i>{(WaR*r2q8sp7cNAc4 zYi_~g)TFp&&Uu+^C_tu$4Opj`OW?=lSlgOPcwSxttZmIG_z7GO*0v@ApJor%wq`th zy?vKRv@J@b152F(tm~Pv0wfN33T#ao^3mUp>X96$tjD)^^>}uPK@_!gDKr$d*lQ`< zfoCA_^9_NwJn-RU!lDKfCN+T2l}2EMB{hsO2>E{`zbWV?)*rOAb|)tpRD zkdw?{Qia#hS~wmw|0WZmk+kQkOkAr_J?*1$X0BFph1slAfd`&Bs&(iX>A1P5RoQtW dk2WDz@CW9u9u@el(hN=M(ED*AE*n`=`5%i9MM(ev diff --git a/c_project/hal.o b/c_project/hal.o index a9f3a9e0e50a0162acabfae6b8c3d551da8c2fbb..03dff693b4e316f220900960255aac4c4d666cb7 100644 GIT binary patch literal 5760 zcmb_fTWnlc72Rj<%*2VEsU4@WO;Z?q(s4rL8QXcMag#W)qX^Rmr8Ol9Oy_ZJ51kh? zcbo(f6-tXl5rR@sRS6Xk;se14Nc>a+qdlw8CFJGAu#6_| zNG3NT-`sXbUV+aaKPmF*^lb&7*gEj&3-n9Mm?yF>o-84GT<41GZiY18QpHq~3_?U= z504+GQUltGC5+mpRoqx{V+|N ztUG6Z_0=~}C)X;XhDWMoAjwwHhCRt9O0woRV9#7Prs&>JVQ>TLig#CC9Z*-Hu8C}q zbDnpYPKF|#&^cKaHMILhn`4mL=7_!2L<%)063$g(M^e;?dMGtI=%pS=ji_D8;V}$s zp9~H@3JO!VN4(U@!AAy93|_<=jN2B>VIrqaPq?<}3C5loe`Rq(!7Z5(Z@@*xka62* zpHt}QD~l6zXdZa+IVG|2mlnq{nETKdQ}4*)Q3s75orZF9dg9bXBjx(AL!wf0#aVH= ztFC;_Sxzgt+Jk+*SMTAAIW@v$*Y4ram!a3&UPQ%oq*;kJOQ=4C_uil46+%Nx~(FA?`zwUl2km+u)i zH=CQ!&ARAllwH<>@j3vEiH3$h~d(y`$>pq|KVzxo+9(~Kw9yJQ4ves;@ zr**~c*{OcqF9gyBJ`Qb0qg%U;PIbNESJHI5@Ys{-b92YiW}?zF^Cxw&-)Ppc3Y(oy{(Q6C zt^19jli&1j=;c(X`}IP-*lPKef`6k}Z`J&KxzK7iKkAnQkqhU}olNh?j32Pmt)S@>F!94%^6h>HyEjKBKE1_%-xizKj}hbl z|F(M*ZStRT-Mwu-_5BpKdRu1ClitkG$&($Sud(}AfF~)PA=+R6`x)M{X0{2>=Oba( zlyI&djM$tTKU@YWG2bT6K?(bc_P6Akv>uYn&_^Tjye9q-`lO@?{AR@FN%>gBzX>}N zu{U9lMC@B^M=_F;=N;5KC7*--S;(d2OTbS>;$MZ0tz;!7-vC;Sw0|4+P{jT|?E9@Z zBVPypN5sAj99>U8fgPQn-m@@hKz@mOl2FTl{2KcG)?zzv#%TPXVE-j-Psv|HOrYfN zsH6S=6Ly15S_Z_!Skl&_|905#LNSuka~q8xLtAt`KM1?G22|wTFoTiso`(~?`M_@(Z8p;#)l{mog} zXD=_$9ku$H)yJU&|3<)e-vJX?!*_)Zv+9HmGHTwaLq;7o>WERc8`}#zVdw54=B#Zq z%-Ixk%(1+v>m}AJm!F_36g{EnxVqxTz`m9j$t^Fjh68(8U2%E&ysIlFi1}7m7_z!z zyqMaIwAxr}&PsTLhS#ILN=4s8yH+sC5T3V(G%{<=O?#Hqk;^fs7VcFgm}te z?jvP4?*y?usCoWm9x^_})0Srn#ZO?!eiSvWq0A7IfINbt4rnNg#P2ouBJslpUn1tB zfqW1}F#+TwC@QC+_{4dG@#!aO*5Dh&_&=b021U(lD4!>`gXbBe>?V1Q*dDOoB0h== z!gD2aOhb*QE&pRs>bT*5PJF`P-w>ZP`1iydD1`f2*#lw+@q*z~z?nyTc-rz)^f_(# zY2q^mbDycR2A_>!G8s;!756UUurucjN$hz3O*x*}@!aWdyu^;5ByaN*JD#sUa~>6h z*ztUAjwg0JUrz>e!fz*H$8(AuPwaS3pL-r+$MfuU&qM6^50JO{i5>q`geP|VHS+fT z5<8w}ab^h>gxK+I;LI{ve8QnP{wA>Fi5-87ynVmKj@SF{0tm=3irZ7Wf!&@WcK&zh z!yw4NP^Rn$198^!Nvwyd0eaxK6*y~sxW=Zo8=g38efE&IpDM&z>$8_U4+98s*81!t zztix2XRQy{@YJZ`iL=({9C;2JLY%ceE9C8EPMozqPmteZ z{E4&Hhu;lT?>0Pf*7`6^y~pt5#0i7?qf;rFL6aIIae!%P2`o!xz&nb~)9c~!M`U`B++YkPtQ!7evI8c znIuFB?}sQLAP+%>1Vu%SlG;@Sky>=!t*l^~-NhA3c12y0t;K>}%i5Ig_nrToo|7zF zTf2Lz?!DjlpZ|R4KhOKQi#QB!n*Fr;-x#lG@e(pkcGtFy8LX2Ed*E1k^bl-Ryi`*NUUPP z9u*nVwS;w*k)djqjvCTLQe((+lDb&1Peq2S52JXKsts?#HF^e4PvOw5F!i-X)<*|@ z6MW?SDi)TOL@v<8RJcJCQ{jc0mv)o@?rf4LKJF)g-sVfr%5apBqvnlyY;_8 z6sEtQ*JVr>|6l=o!gTRpuY3(Fp+(|5zOoi8uT98{3;RIU3VEsOQjm4AU?!;|Ki1Mc zAPDn>4s#d;asI8YXT6kpxqds!Y!LF3`V`2fSdfLlD_UT)6$OEl>d8`<qk1I?EBMjpuv0Y&D~e{1u#&&{ z1oHZY%}Cy`uvve>FOauh*a2TJ=ncZI5zo!S4ocp|!am|R{RZX6gdGykZNjeetJu69 z!jAa!AA;vq&APQu_>G+D7kfg#=r?dCj~V(Ezvd)-U-2dP8-Cp(H25_`kNFFtRZ6|- zqfbwu0<$+SBCZW{{_2qkqlhySn(A$%HvCg~E~23}{7b;b!-$EK&2gv64%{MSHL@t@ z;G7RikHDaJT~02&{Cwdh%Q3RL!EN5MrC57QNopc%z38{#AwBaRub#xPvpqcz%*e0v z^gM{7E_Oj}n8I2l7TN4Y|4{h>l<7Xnd&99@QnS;0cOSnb1Nx6^twd@`;+*D$~ro(qMS#pT6fY?;jCQq`NFqbzC%Zf$)Z* z<~KL4!zH=^rM99}i&}I(E~}XrZEB-Q@S;T-m^AjHHNapVU41@G=!wND6g#K- z-0G3)t&Lb0CI`J4F*y;*nYYBNt`9%)#lIch|f4 zVlGRf*zR|6s3`dAfc4e81MZthSgG%lavm4(LYzJCKQLYJngz_aE3dmSUG6SsN~yha z9_;U&$?wS*X7iot>_m4apUTdRr@M2B)Kn&)R*ri%lkA>MrQWsJa93Yfk1gyL(lz}z zb(Hp(a7##JyHadIFrJ=B%w)?!dH-~})HTIuOXYD`fzjBC9XnGooz9nG2Fw;xdjtjW z#=Do0bg`H(2xJXYx|1SHR77`MsM?D}LLRmdFS2A_=voabhSRub9DC=5xRJ7?zKR(Z zbZ;P!{TJaQ=RZxVne^>?ST)H@!&ZqXPAecdz!_1tXDW|3qMYKIp zPN-luRV){BNi-x;hR$rNqG4EMEu9njLT7R& zlPzcRozq1~Plzp5$mI%o;8MAmNtHYI7P5(QCY$a|X37(pbauR?f?N`z&Zg!42H!%!CS(i4xjP_o)J&>w};KV<8`;_hrgKqBx0)QiZ~v44q1o z*_pIR>Ry=0CYYZo1*v`LOFbE&nBAlMCctD1Fe$Q`5_&APx2)?cOiYy0;JGAw8vSkK zM{{s1vTPzRbx-6`0mD|o1m_)x5cNP-1sgMyI*iFgE|<_wKp6gXVw~p^XZ9Z5Hg)Rg zVVI|qTBk50q46g8F2g*5E>}T5Q%IInX{t~xx11`3IfHKMkq8snK({baN|iIYv=9jc zL7+-Ci*VThHiYd#@AV=JG?C@Z)hh^-u$bXowv%=L>*iF|ri1ydZf ze8DtW_plCSJi&!j(rwf|5(Hbej*aS}>d;x+tnO32s)CZ)zPhIh zIou2irBe6iLTV<5ZMW3DH@#19>p?D!;Z96XLo~fFk(-k$hKSI=-)&sk!?Zq09he?;<>chFntEB&&m?+&YlwF_Cxv)Rb5aO5 zc>Ue4V)On_91p7|NqPNcOIw6D*=)qa`cCKib;R*+InBTFIBm-RfBCSZUx5H2d9ALP zLZ|gcNX@mBPWTvF@fCjRh=x>5E4cNY+TV4j&4Ky);p?V~YD}#G{!HaLET+1^Uv~IV z#h1WS7vSvHckwCtHEJh#e`Q+4)ce8t7A7gC#sNkv($Zt08itP6jS#BbUOYIgEyF5>K_4q+sS_t{3(YY13%M=?-}s(oc?(M z{6&W!2mgvw{sj0r4u1u_-tm7Oe5u3V1i#Ix?;Ua{|0H;ylh0oS-g4Ss1ME5VHGxk# z8 zC&4q0e;B^aj(-jCPaNI^yxM8+3h=9({%Zr@;OMObU+LucgFoQpuLu7#hi?Ywo**fv z#=xJ(VfhZ=&pYki4gOsxe;hdM#Fqshb$A*4Zl}J3;1}Ys`Zogq-pRiM{4bsQ?gd|M z-8uf?KX>wvfd9zhPlEGzH>-aP{3i~72K;dxHva|SRSrK6Ty*;H1o&A_`B%WVI{vQ% zf7OZqP4MlG|2yC}IQ}Pr8y$WA`t@O_d=2w)o2qf&k|c(qf03_R)Z9pE=Qd^h+JhmV8j9i9b$z^R{WYtU)$N5QL{{9C}k zhC@co2~_`^;-JHdbK=m+5L^HLhzeLmO&K9{1Z2)?>vh^qbI zmpYtZZ{6}YgAZ2nW9m-ux#X$)z}@;k4W6$!MAc*9D=OSmPk?_NhoqRsZuvh)-a4C& zfqWKx?!nkoe^Dt*Cr_^(_jz>gS%CSKjwZqLT&=#^Q%HVJwG{ac>Q$r9m>Qt}OQ$~8 z^RM8{BWAvNJ?a|kX;EEc(kGXGxeUly+*Is z24wVljb5+u?=`x;Mz`1K+V1EzdVNN(&*=5p78<=iqtj<}`ixGWiLcMp*Jt$ljb6Xe z>o;5qc?2y zhK=5^(Hk~;!$xn|=nWgaVWT%}^oEVzh|wD{dLu?}#ORF}y%D1~V)RCg-iXl~F?#VH zBN*>7it!#J8SgQg@g5@@?=h{BOLFs%5ke4x5|~pQdupP$LLx5{>s$L;Eg+vOAQwZYp36t^oUu9wc1jcm)7QJ%-P?_gxOun;b6@6IvXG`+;O zY@~6^D9`X0ch@dE8qi1^9m#?+n3N^EXC+lbE+`=1iONAL%T&la2}Ha8~x z@Sr?ag0v5Z$Cq}bn{jyE8mf;GvjdPGz`>slnU3J_dNou>iA@K6kGNm#KO!Cw{5xWE z0}kVMgT!Y??<&DX;`a%@me~9pcL%ZgosZAQ{7ssP?`huq1wTd1 z35fJ7;y~~_#2*yQXHhR9csX%W@LJ-O-~r-s!5fJ=k&!MVo)FAuJa1AkpXaBdBe;+Fvw|-p{+!@l#E%M|Bz{bAiP)^W1H^~L{!!r8BXhXJ*zcjw<6=Kd z{CUAo5r0AOH;JDR{4((u1^&LOw@#MaKOs`VQxXG8?KN|_-T3f1;mn0%CvG=B zSJPfEcH(y9lcc>t?8NQHXNvYlu@ko&pDgXm#ZKIAeAo}(3b8j6M+DQ<%1Meu++pmT zSJuCum>rBXjH8ueNW>k+-VQtvqZM`H=;wl9>MHHel@m!^@e`@OPFYk;XA@m~Raag5 z?-pIjQb~1b>)aDF@|+I2Q-;w0BDKI5-L1?tQtUJKk4@Y+m^d`V8*nfk!h&aCbC_73d7KjLL-G&~ zrmS2lXXY`j!@;TeKl$--*Omd)daKNwB)55SU^l*_h;JL#0ORA-u<>nl$^fd{q1EOS zNwRu;w6mBwUq$0SE-w0P^R|Jx^{P&#jv|xwvVFGRG_WlLsLsVYX(2Gl=6w*{)jQfX z*UxOW)#E;6%K)lf(EG4su&`{(Y@id;YtTE1E92vMS-qQpS%zcEbR28qI(D2%%;RyF zxmv$Vv8K*4KD<~z-inEB+6TY&mf*^InRx4W+xtqlyhkybh(b-CTyxd*6jZBgpqZBXD=kK2~(hnHyeENnJezyAat CWRRo) diff --git a/c_project/libpqvexriscvsimbsp.a b/c_project/libpqvexriscvsimbsp.a index 478caae9b166ba43725bfb4415463bac5e49d7b6..fe6b4e082c245b9c1f40e6dd631b0685e550336b 100644 GIT binary patch literal 3726 zcmbtXPmB{)82@Ib(^*!~ZdYv;|4ch&w=B!FTM8QuF)ho2F&jlA(F4hJwiLFZ-7V7* zfsnY(gv5gv!vT*PJ(?&9BwU-w9d8~r9P~=OcrfDcn|W`Uoj~x1E9Q2o#%P4&sc9}$rAKR$hzuenyIoU9h$3~Ik2~%;$LX$jeG;iKoq>&< zC>{E)=acWb1E;g@dzYx|onLZ$y;Zk;jw;Cx#`^atSU)7Kt;xap3!RHzci6r#?DoU< z?Tt#p8aB@6$%_0iQ9+!>$KX)C9(pVuluflJKUrQmrYH&qBoc*wr-zK_GePQMahZ0| z1fAWaQ0e&6((7jV_}eG>@;euOvQN9dOZMt;NOpUp-^WrRI~*h1^?k3q`jOumif;X*Y&X1k+|t6E z=SF@fo8%}IfZ0!u(qS%)374_VLOK3Pe)I6*7&(hv-!xPTm$4p%qOO6ozXMQ^1UdV# za2}sg4)`95tr;qRM+UkBD*FaVCIX8Lgvk1)z~g>LP;gv2A(wuYT21VfD0|X=sU2Jt z8|KOTr79*u?w6hPRICR?*U^bV;l?r6dERa=hk~Q}(S@SMg_IdPYq*}$# zRjc%sYR%kGt@2p4=6+PI`CnAazOP!Qq9a~MypDJs@jBvl#OsLH5pN*gK)iu?1Mvpp z4a6IWH)Q_;vq@TEL_uLpT2WDgVpGwqkrG&AMJp+4P-?2$o{<{t8LQfiq6ITeO`9EQ z!R%Pm%1SCIH&fc)Q7YIwPHA(B9?Ug$ZQn=__KkIIUP%Y@&9t_Eln(Zf)0(Xqf!#E; z%E$;RV*_J3F(k9fV-uHW1<@|QN6HmN*}Y3Oc-`?j=CdU(O-vTa{Jne z$1?se=cC*MQC+EUPu$+BIO1CrCkgvMJX<2p-x5j0x$kjqN-E+T3I1k+w_=>nv__2Y z1m<%mk`&HxqLyHM(sA4G$M`G2H)Fg6e0S@k<;fU1Xj>BL$ z$%_TdSlW5+axX?sjHR9TZ=Nq42xDpICUbo8LKsUs@98|hCn1cb-2~3D0b)X>y#$;W z+nTYoH-K|5BY`xa(tZ>;&mD&_mUiAlIbQ4##?rn5oZrP(BF56*0?xgP1k!>^`)T0( z(?}qUrF{)JYa)R#mi7T~w!qftf|vGhz_WawK^RN>x4>D8twfBa{WkDE=uYTS?9VLj zAr{8crwpDE54OXMd7>aEpc%gGA*Y}jJ`^Cl@293i7_RXto{(UH&kW0V60qn(eJOBUy literal 3644 zcmbtXO>7%Q6n?wwwbPJ7egGTF&nD~UukOZiqBgA}6st->Co!*HB(+UQ zQ4zIPm5Rg#6{#G{t%qJXAaS)sC5}bn$N|&?Tq`adP|Nqt?zEe2t0M8NH}kzW@6EoM zdGq7ZMZZa>-nIHV83{2cxfTt*--&Y5_HENUTkT!s1I*x4}ARIF3Q^KCq4rP*&l{m^JDChM9e&6G;fE)6Ta6Dd7zua@SHL?%z)tEadKAiY-yHPlxx+mb~hjHJ_2{pXehW45^0KScX7+LqnrPo33})bRENnzYTvI z{xV}=ool?}`78iCt0 zth`|c`Lbyp?3%&Bo@tF6Rxn<+tck7_O!O>k(ntl9<&-tmO$AfElr?SG!F1WS4t4F| zP|vmsMmi{z)7If`Iyl@*Tb_{#ymH2x>1KkNUIug7*A}O!&Ron7>G`k{G#ybH|G85SsULu%=>ueQ%7E#A&=FT~o1fg3S72fP-OIej-`GGqCXK`P>D@sN0z#L2>` zvKmtiV|>#wnd`Nfke3qj+X?xdg#1xLt|sJ-gxpNXEyzDaItTH62CTHeWR?^T%Q=O4)17T>t^1A2_EvqfQ)}h%PTH0VZ>vh9>4!)vHFbSeD!9L*cNE@G zr={uFH$~luPk2@#F0NfR8wSg{%SGoN^C!!N0};to7G{hhIklx(?R*o4|*_{PY5HeRvcg z!rEpY^5C;dEpHJ&7vfdo!4Pi{^MVB301t7qftX)IBO!KB9m8Ef;@rB?79yUA^mq?F z@m=)DlSn<3)GOXou(nY-)AF0O|M5oRQX=FByPIQ=Qz{ZTO|;XeV$zOnqzP~z_-S_f z?W0eXCHUOdod8GEta6Mou$|P0dHV%+Ol9iHT+2l;-SsIx2vC5mNsr?w6!HFkMF4r| z*dJrj{hb8H7`9O2vYd-)0 diff --git a/c_project/main b/c_project/main deleted file mode 100755 index 486cffd2813c885831573fc201d0a2022e77c438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46028 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 #include "hal.h" -typedef struct { - volatile uint32_t state; -} My_Mem; +// typedef struct { +// volatile uint32_t state; +// } My_Mem; -#define MY_MEM ((My_Mem*)(0xF0030000)) +// #define MY_MEM ((My_Mem*)(0xF0030000)) int main(void) { printf("HELLO WORLD\n"); uint32_t state = 10000; - uint32_t state_return; + // uint32_t state_return; while (1) { printf("State in : %i\n", state); - MY_MEM->state = state; - state_return = MY_MEM->state; + // MY_MEM->state = state; + // state_return = MY_MEM->state; state = state + 1; - printf("State out: %i\n", state_return); + printf("State out: %i\n", state); } return 0; } diff --git a/c_project/main.hex b/c_project/main.hex deleted file mode 100644 index fcb07ac..0000000 --- a/c_project/main.hex +++ /dev/null @@ -1,446 +0,0 @@ -:0200000480007A -:10000000130000001300000013000000971104000B -:100010009381C1C1170106001301C1FE171500002D -:1000200013054574970504009385C5FD1706040064 -:100030001306C63F63FCC5008322050023A05500BC -:100040001305450093854500E3E8C5FE1705040048 -:100050001305C53D970504009385453D6378B500BC -:100060002320050013054500E36CB5FE9700000052 -:10007000130101FF23241100371500001305058823 -:100080007310453037250000130585807310053047 -:100090001305000093050000EF00C0126F104035FB -:1000A0006F000000130000001300000013000000A8 -:1000B000130101F8232211002324210023263100FB -:1000C00023284100232A5100232C6100232E710094 -:1000D00023208102232291022324A1022326B1029C -:1000E0002328C102232AD102232CE102232EF1026C -:1000F0002320010523221105232421052326310570 -:1001000023284105232A5105232C6105232E71053F -:1001100023208107232291072324A1072326B10747 -:100120002328C107232AD107232CE107232EF10717 -:10013000EF00800883204100032181008321C1005A -:100140000322010183224101032381018323C10191 -:100150000324010283244102032581028325C10275 -:100160000326010383264103032781038327C10359 -:100170000328010483284104032981048329C1043D -:10018000032A0105832A4105032B8105832BC10521 -:10019000032C0106832C4106032D8106832DC10605 -:1001A000032E0107832E4107032F8107832FC107E9 -:1001B00013010108730020306F00000000000000F0 -:0401C000000000003B -:1001C400130101FE232C8100171500001305C555EA -:1001D40037240000232A91002328210123263101FA -:1001E400232E110013040471EF00107D97190000F1 -:1001F40093898954B70403F0171900001309C954EB -:100204009305040013850900EF00107B23A08400EC -:1002140083A504001305090013041400EF00D0792A -:100224006FF01FFE97070080938787DD99C7171526 -:1002340000001305052A6F10202D82806376D600F6 -:10024400B385C5002380A500678000006780000097 -:10025400130101FD0323810323202103232E3101F4 -:10026400232C4101232A51012328610123267101F2 -:1002740023248101232611022324810223229102B3 -:10028400232291012320A101137C2300138B060058 -:10029400130A0500938A0500930906001309070051 -:1002A40083260103832B410363140C061375130087 -:1002B400639A0B1C63F6D7021307F0016364F732E9 -:1002C40013060003930500026F008000638AB700E1 -:1002D400938717003307F900A30FC7FEE3E8D7FE9F -:1002E4006308050263F6770313070002638EE71AB7 -:1002F40013060003930500026F0080006386B71A9B -:10030400938717003307F900A30FC7FEE39877FF1D -:100314001377030163020708137703406314071A72 -:10032400639E0718130700016382E82A93072000DD -:10033400638EF826930700032300F9009307100047 -:100344006304081A3307F900138417009307D002D3 -:100354002300F7001373330063140300636A740FFC -:10036400938C09006F00C00413070002638AE7023C -:10037400B306F90093871700130780072380E6006C -:1003840013070002638EE7003307F90093060003A6 -:100394002300D7009387170013070002E392E7FABC -:1003A400137333006302030A938C090013040002DD -:1003B400B38C8C00330D9901330489000345F4FF99 -:1003C40033068D4093060B001304F4FF93850A0053 -:1003D40093840C00E7000A00E31289FE63080C0210 -:1003E400B389344163F479031386040093060B0044 -:1003F40093850A001305000293841400E7000A00A1 -:100404009389190013860400E3E279FF8320C10273 -:100414000324810213850400032901028324410279 -:100424008329C101032A8101832A4101032B01018C -:10043400832BC100032C8100832C4100032D010078 -:10044400130101036780000013040002637C740B32 -:10045400B38C7901B38C8C401386090093060B008E -:1004640093850A001305000293041600E7000A00AE -:1004740013860400E39494FF93840C00E31A04F2BB -:100484006FF0DFF5630E05086316080A1377C300DF -:100494006312070AE3F8D7E41307F001E372F7E203 -:1004A40093070002E3F677E793770301E38A07EE05 -:1004B400937703406390070E930700026380F60866 -:1004C400638E770713070001638AE8081307200087 -:1004D400E398E8EA13070002E384E7EC3307F90042 -:1004E400938717006F00C00D137743006310070252 -:1004F400137783006316070813733300138407000C -:10050400E30603F4938C09006FF01FF73307F90037 -:10051400138417009307B0022300F7006FF09FE3E2 -:10052400E3F8D7DE1307F001E37CF7D89307000262 -:100534006FF01FDE938BFBFF6FF0DFF51387F7FF80 -:10054400630E0704930600016380D80C9306200011 -:100554006386D806930707006FF01FE3137703023F -:10056400E30407E013070002E38CE7E23307F90032 -:10057400930680052300D700938717006FF05FE090 -:100584003307F90013841700930700022300F700D0 -:100594006FF05FDC930700026FF0DFF29307000156 -:1005A4006388F80493072000E396F8FA930720067B -:1005B4002300F900930710006FF01FDD3307E900F3 -:1005C400930620062300D7006FF09FDB1377030206 -:1005D400E31E07F8930780072300F9009307100030 -:1005E4006FF09FDA93070002E31E05CE6FF05FD22F -:1005F40093770302E38007FE930780052300F90045 -:10060400930710006FF05FD8937603029387E7FF98 -:10061400E39E06F4B306F900930707006FF0DFD5F5 -:10062400130101FB232E3103232611042324810407 -:10063400232291042320210583294105631A0704F9 -:1006440013F309409300010193F9F9FE63020304D3 -:1006540003230105232431012320110123226100F6 -:100664009308080013880700930707001387000006 -:10067400EFF01FBE8320C1040324810483244104BA -:10068400032901048329C1031301010567800000C4 -:1006940013FE090213031006631C0E081379F30FEB -:1006A400930F07001353F701930001011307000090 -:1006B400930310009302F0FF13049000130969FFE1 -:1006C40093040002130F0000130EE001B3DECF41C8 -:1006D40093FE1E001313130033E36E00B39EC30195 -:1006E400130EFEFF6346030133030341336FDF013F -:1006F400E31E5EFC1373F30F6366640213030303C8 -:100704001373F30F13071700338EE000A30F6EFE6D -:10071400E3000FF4E30E97F213030000930F0F00AE -:100724006FF05FFA330323011373F30F6FF09FFD30 -:10073400130310046FF09FF6130101F7232C8106B5 -:1007440023206107232E71052328A1052326B10543 -:10075400232E1106232A9106232821072326310755 -:100764002324410723225107232C8105232A9105A1 -:10077400232611093363F700232CA100232EB10093 -:10078400130B0600938B0600130D08001384080056 -:10079400832E0109832DC1096316030893F60D40C6 -:1007A40093FDFDFE6380060893090000130A01020D -:1007B400832781098325C101032581012322F100B7 -:1007C400832741092324B101930804002320F10065 -:1007D40013080D009387090013070A0093860B0082 -:1007E40013060B00EFF0DFA68320C1070324810763 -:1007F40083244107032901078329C106032A8106AB -:10080400832A4106032B0106832BC105032C810592 -:10081400832C4105032D0105832DC1041301010916 -:100824006780000013F60D0293061006631E060E81 -:100834009384070093D5F40193070700130E000077 -:1008440093090000130A01029300F0011309100038 -:100854009308F0FF930A9000938C66FF130C000238 -:100864001307E003130F000013030000939F140009 -:100874003386E04093D2F50193161E0033D5E7008A -:100884003396CF00130807FEB3E6D2009395150004 -:100894003365A6006344080033D50441137515007D -:1008A400B365B500138E060063C8D6033316E9009A -:1008B40033858540B3B2A500B383D6411358F641BE -:1008C4006394DE0063EA850093050500338E53408C -:1008D400336FCF00336303011307F7FFE31A17F9EC -:1008E40093F5F50F63ECBA029385050393F7F50FBF -:1008F4009389190033073A01A30FF7FEB3676F001A -:10090400E38807EAE38689EB9355F301130E0000AD -:1009140093070F00930403006FF09FF4B3859501D0 -:1009240093F7F50F6FF0DFFC930610046FF05FF0A0 -:10093400130101FA23282105232631052324410527 -:10094400232C81032326B103232E1104232C810499 -:10095400232A91042322510523206105232E7103A8 -:10096400232A91032328A103938905001309060070 -:10097400138C0600930D0700170A0000130A4A8D12 -:1009840063840500130A050003450C00130D0000E1 -:1009940063040516B70701009387F7FF930400016A -:1009A400971C0000938C0CBF130B9000232AF100BA -:1009B4006F00000213060D009306090093850900D9 -:1009C400130D1D00E7000A0003450C006306051221 -:1009D40093075002130C1C00E31EF5FC03450C00A6 -:1009E40013071C0093060000930705FE93F7F70F07 -:1009F4001306070063ECF40293972700B38797016B -:100A040083A70700B38797016780070093E6160062 -:100A1400130C070003450C0013071C001306070002 -:100A2400930705FE93F7F70FE3F8F4FC930705FD2E -:100A340093F7F70F6370FB129307A0026308F51C8A -:100A44009307E00213060C00930B0000130C07003D -:100A5400930F00006304F5149307A0066306F516CC -:100A640063FEA7069307C006630AF53C9307A00735 -:100A74006318F5000345160093E60610130C1C00DA -:100A84009307B5FD93F7F70F13073005E364F7F207 -:100A940017170000130747B493972700B387E7009D -:100AA40083A70700B387E7006780070093E6260063 -:100AB400130C07006FF01FF693E64600130C0700B3 -:100AC4006FF05FF593E60601130C07006FF09FF4D7 -:100AD40093E68600130C07006FF0DFF3930780069C -:100AE400E310F5FA03451600630EF53893E606089D -:100AF400130C1C006FF0DFF813060D0063642D0166 -:100B04001306F9FF930609009385090013050000F5 -:100B1400E7000A008320C1050324810513050D00A5 -:100B240083244105032901058329C104032A81047F -:100B3400832A4104032B0104832BC103032C810367 -:100B4400832C4103032D0103832DC10213010106EC -:100B540067800000930B00006F00C000130C0700B7 -:100B64001307170013942B00330474011314140097 -:100B74003304A4000345070013060700930B04FD88 -:100B8400930705FD93F7F70FE37AFBFC130C2C0096 -:100B94009307E002930F0000E310F5EC0345160001 -:100BA40093E60640930705FD93F7F70F6378FB027E -:100BB4009307A0026300F52A9307A00613060C000E -:100BC400130C1C00E31EF5E893E60620034516000B -:100BD400130C1C006FF0DFEA130C0600939A2F002D -:100BE400B38AFA01939A1A00B38AAA0003451C0037 -:100BF40013061C00938F0AFD930705FD93F7F70F67 -:100C0400E37CFBFC130C2C006FF01FE583AB0D00A1 -:100C1400938D4D0063CC0B2003451C00130C2C005A -:100C24006FF01FF703A40D0093874D00232CF100F0 -:100C34000345040063920F24930DE0FF630A0552F9 -:100C440093871D002328F1003306F4009307040062 -:100C54006F008000638CC7009387170003C70700E9 -:100C6400E31A07FEB38787402328F10093FA06406E -:100C740063880A008327010163F4FF002328F1013C -:100C840093F72600232EF100638407366308052CAE -:100C9400638C0A28B38AAF0113060D006386CA0267 -:100CA4009306090093850900930D1600E7000A00D6 -:100CB400B387AD41B307F40003C50700630C052CEB -:100CC40013860D00E39ECAFC8327C101138D0A001D -:100CD40063960728832D81016FF01FCF03A70D00B2 -:100CE40013E41602930780002320F10013060D007D -:100CF4002322810093880F0013080001930700004A -:100D0400930609009385090013050A00EFF05F912B -:100D1400938D4D00130D05006FF01FCB93874D008D -:100D2400930A1D0093F626002328F10013840A0079 -:100D34006386062603C50D0013060D0093060900FD -:100D440093850900E7000A0013071000338DAB01F7 -:100D54006378773B93071400130604009306090095 -:100D6400138407009385090013050002E7000A00B5 -:100D7400E3128DFE832D01016FF01FC593078007D9 -:100D84006304F53C930780056306F5109307F006AA -:100D94006302F53293072006630AF51013079006E1 -:100DA40013F6F6FE93F706401308A0006314E5104B -:100DB40013F40620638A07101376E6FF9307900660 -:100DC400137406206302F51093074006630EF50EB4 -:100DD4006318042E9377061013844D00639A073426 -:100DE40093770604639A07309377060803A70D00E8 -:100DF40063860700832741013377F7002322C1006C -:100E04002320710193880F00930700006F00C00F27 -:100E140013060D009306090093850900130550027B -:100E2400130D1D00E7000A006FF01FBA93E62600B9 -:100E3400B30B704103451C006FF05FDE03451600E1 -:100E4400E31CF5C293E6063003452600130C360076 -:100E54006FF01FC383AF0D0003452600130C36004B -:100E640093C7FFFF93D7F741B3FFFF00938D4D0066 -:100E7400130626006FF05FBE630C052E938DFFFFF3 -:100E84006FF01FDC93E6060C03452600130C3600B6 -:100E94006FF01FBF13F636FF93F706401366060282 -:100EA40063840720130800016FF01FF1130820006A -:100EB400138606001307400693770640631AE52C51 -:100EC40013740620E39A07EE631E04169377061044 -:100ED40013844D00639C07229377060463980720CC -:100EE40093770608638C072683970D0093D6F74102 -:100EF40033C7F6003307D7402322C10023207101F2 -:100F040093880F0093D7F70113060D009306090089 -:100F14009385090013050A00EFF08FF0130D050007 -:100F2400930D04006FF05FAA13060D0093060900E9 -:100F340093850900930A1600E7000A00B387AA41C3 -:100F4400B307F40003C5070013860A00E31005FE87 -:100F5400138D0A008327C101E38E07D6832701017D -:100F640013060D00E3F877D73384AB01330DF44057 -:100F74009306090093850900130500021304160063 -:100F8400E7000A0013060400E314A4FF832D810183 -:100F94006FF09FA3138D0D006FF0DFFB130710009C -:100FA4006372771F1304FDFF330474016F00800024 -:100FB400938A1A0013060D0093060900938509000D -:100FC40013050002138D0A00E7000A00E3928AFE6B -:100FD400138D1A0003C50D009306090013060400BF -:100FE40093850900E7000A00832D01016FF0DF9D5E -:100FF400032701019307170063707719B387AB01C7 -:10100400B38DE7402328F10193071D0013060D005B -:10101400930609009385090013050002138D070048 -:10102400E7000A00832F0101E31EBDFD0345040010 -:1010340093871B002328F100E31C05C4832D810141 -:101044006FF09F98938D7D0093FD8DFF03A54D0058 -:1010540083A70D00930808009356F541B3C7F60023 -:101064003387D740B3C5A600B3B7E700B386D540EE -:101074002326C100232471012322F101232001002E -:101084001358F501B387F64013060D0093060900C3 -:101094009385090013050A00EFF00FEA938D8D0084 -:1010A400130D05006FF05F9213F40620130800017E -:1010B4006FF01FD213088000138606006FF09FDFC5 -:1010C400938D7D0093FD8DFF03A70D0083A74D0035 -:1010D400930808002326C100232471012322F1016F -:1010E40023200100130800006FF01FFA83C70D00CE -:1010F400138707006FF05FE003C70D006FF01FD088 -:10110400138D0A00832D01016FF01F8C83A70D003E -:1011140093880F002322C10013D7F741B346F70089 -:101124002320710193D7F7013387E6406FF0DFDDA9 -:1011340003A70D0093880F002322C100232071010F -:10114400930700006FF05FDC93F70640130800017B -:1011540013F636FFE38407C66FF01FC683A70D009E -:1011640093D6F74133C7F6003307D7406FF0DFD883 -:10117400232801006FF09FAF2328F100E31A05B084 -:101184006FF0DFEB13040D00138D0A006FF09FE482 -:10119400930606006FF0DFFB631405006780000010 -:1011A4006F00801A6308050003A3050083A54500AA -:1011B4006700030067800000130101FC1303410270 -:1011C4002322B1022324C1022326D1022328E102CF -:1011D4009306050093058100130703001306F0FF2F -:1011E40017050000130585FB232E1100232AF102A5 -:1011F400232C0103232E110323266100EFF04FF368 -:101204008320C1011301010467800000130101FC64 -:10121400130381022324C1022326D1022328E102DD -:101224009386050013070300930505001306F0FFDA -:1012340017F5FFFF1305C500232E1100232AF10221 -:10124400232C0103232E110323266100EFF04FEE1C -:101254008320C1011301010467800000130101FC14 -:101264001303C1022326D1022328E10293060600B8 -:1012740013070300138605009305050017F5FFFF08 -:10128400130505FC232E1100232AF102232C01034C -:10129400232E110323266100EFF08FE98320C1017F -:1012A4001301010467800000130101FE1387050088 -:1012B400930605009305C1001306F0FF170500000F -:1012C4001305C5ED232E1100EFF08FE68320C10135 -:1012D40013010102678000001387060093060600CD -:1012E400138605009305050017F5FFFF130545F563 -:1012F4006FF00FE4130101FC1303C1022326D10292 -:101304002328E1022324A1002326B100930606002A -:1013140093058100130703001306F0FF170500006F -:10132400130585E8232E1100232AF102232C01033F -:10133400232E110323226100EFF08FDF8320C101EC -:101344001301010467800000130101FEA307A1003B -:10135400930510001305F100232E1100EF00C001C6 -:101364008320C10113010102678000001385050079 -:10137400930506006F004000638605023306B5003E -:10138400370701F0834605008327470093D70701F9 -:1013940093F7F70FE38A07FE2320D7001305150000 -:1013A400E312A6FE678000008346050063840602FC -:1013B400370701F08327470093D7070193F7F70F07 -:1013C400E38A07FE2320D700130515008346050092 -:1013D400E39206FE67800000F32500B8732500B091 -:1013E400732600B8E39AC5FE678000004111814569 -:1013F40022C406C62A841928970700009387C73594 -:1014040088435C5D91C3829722854922797197074D -:1014140000009387673462C403AC07004ECE52CCFD -:1014240056CA5AC806D622D426D24AD05EC6AA8A3A -:101434002E8B054AFD5903298C1463040902832465 -:1014440049001384F4FF634E04008A04CA946306BB -:101454000B0283A74410638267037D14F114E3181D -:1014640034FFB250225492540259F249624AD24A89 -:10147400424BB24B224C4561828083274900D440C1 -:10148400FD176380870423A20400E1DA8327891807 -:1014940033178A00832B4900F98F99EB82968327AF -:1014A4004900E39A77F983278C14E38827FB61B713 -:1014B4008327C91883A544087D8F19E7568582962A -:1014C400F9BF23228900D1B72E858296C9BF411165 -:1014D40022C4970700009387A72817040000130469 -:1014E40024281D8C06C626C2098411C8931424001E -:1014F400F114BE949C407D14F114829765FCB240B3 -:101504002244924441018280AA85814601460145D4 -:1015140009A09707000093872724984383278714FB -:10152400A1C3D8437D48634DE804131827001DC1A7 -:10153400338307012324C30883A887180546331679 -:10154400E600B3E8C80023A417192324D31089465E -:10155400630DD5000507D8C3C2978CC701458280A7 -:101564009307C7142324F7146DBF83A6C718050770 -:10157400D8C3558E23A6C718C2978CC7014582804D -:101584007D55828067800000678000006F00000046 -:1015940040F5FFFF9CF4FFFF9CF4FFFF34F5FFFFD1 -:1015A4009CF4FFFF9CF4FFFF9CF4FFFF9CF4FFFFFF -:1015B4009CF4FFFF9CF4FFFF9CF4FFFF28F5FFFF62 -:1015C4009CF4FFFF1CF5FFFF9CF4FFFF9CF4FFFF5E -:1015D4007CF4FFFF3CF8FFFFE0F3FFFFE0F3FFFFC5 -:1015E400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFFB3 -:1015F400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFFA3 -:10160400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF92 -:10161400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF82 -:10162400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF72 -:10163400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF62 -:10164400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF52 -:10165400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF42 -:10166400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF32 -:10167400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF22 -:10168400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF12 -:10169400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFF02 -:1016A400A8F7FFFFE0F3FFFFE0F3FFFFE0F3FFFF26 -:1016B400E0F3FFFFE0F3FFFFE0F3FFFFE0F3FFFFE2 -:1016C400E0F3FFFFE0F3FFFFA8F7FFFF48F7FFFF9A -:1016D400A8F7FFFFE0F3FFFFE0F3FFFFE0F3FFFFF6 -:1016E400E0F3FFFFA8F7FFFFE0F3FFFFE0F3FFFFE6 -:1016F400E0F3FFFFE0F3FFFFE0F3FFFFA8F7FFFFD6 -:1017040008F7FFFFE0F3FFFFE0F3FFFF50F6FFFFF2 -:10171400E0F3FFFFA8F7FFFFE0F3FFFFE0F3FFFFB5 -:10172400A8F7FFFF48454C4C4F20574F524C440AF2 -:1017340000000000537461746520696E203A20250E -:10174400690A00005374617465206F75743A20252A -:08175400690A00000000048096 -:04175C0028020080DF -:1017600000000000EC02048054030480BC030480E9 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000100000000000000D7 -:101810000E33CDAB34126DE6ECDE05000B0000009C -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:081B800000000000000000005D -:040000058000000077 -:00000001FF diff --git a/c_project/main.o b/c_project/main.o index 5ba535e197355a1bfd9f563ebac9eea48c06a2fe..a4b9ea5f2e55ed289c840c3abe1e52ee81001284 100644 GIT binary patch literal 5652 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 diff --git a/c_project/memcmp.o b/c_project/memcmp.o index 666c6aa3004775ed0cd9b522ce4fccb278cda45d..6428b397f9c4de9953be48dfcdf16bd3e9dc241f 100644 GIT binary patch delta 1780 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 Bw%`B& literal 17800 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 KH(8;@wfjG`1nd|9 diff --git a/c_project/memset.o b/c_project/memset.o index 3ec3a822f8dcf1837512f73ad84de95650ec0e4f..9c9bb7638aaa4ed8adb8724a0b5d17c70513183a 100644 GIT binary patch literal 5176 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%0A*IfvnS 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 V4GP@q%|FTS_lWN+EMSuL`yXJ6KPUhI diff --git a/c_project/pqvexriscvsim.ld b/c_project/pqvexriscvsim.ld index 1d34047..229954b 100644 --- a/c_project/pqvexriscvsim.ld +++ b/c_project/pqvexriscvsim.ld @@ -3,12 +3,12 @@ OUTPUT_ARCH(riscv) ENTRY( _start ) -__ram_size = 384K; +__ram_size = 128K; MEMORY { - rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 256K - ram (wxa!ri) : ORIGIN = 0x80040000, LENGTH = 128K + rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K + ram (wxa!ri) : ORIGIN = 0x80020000, LENGTH = 64K } -INCLUDE nonvolatile.ld +INCLUDE volatile-split.ld diff --git a/c_project/printf.o b/c_project/printf.o index 89e63bbb7ea9d50b059743b4cbe7420fc00d1061..d45eeec5a7749bfb88f6c796c7d59f6a5b50566b 100644 GIT binary patch literal 128024 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 literal 122220 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 diff --git a/c_project/vexriscv/init.c b/c_project/vexriscv/init.c index 35df643..29eb940 100644 --- a/c_project/vexriscv/init.c +++ b/c_project/vexriscv/init.c @@ -6,8 +6,3 @@ void __weak__fini() {} weak_under_alias(_init); weak_under_alias(_fini); - -void _exit(int code) { - (void)code; - while (1) {} -} \ No newline at end of file diff --git a/c_project/vexriscv/pqvexriscvsim.ld b/c_project/vexriscv/pqvexriscvsim.ld index f3e1ee6..229954b 100644 --- a/c_project/vexriscv/pqvexriscvsim.ld +++ b/c_project/vexriscv/pqvexriscvsim.ld @@ -8,7 +8,7 @@ __ram_size = 128K; MEMORY { rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K - ram (wxa!ri) : ORIGIN = 0x80010000, LENGTH = 64K + ram (wxa!ri) : ORIGIN = 0x80020000, LENGTH = 64K } -INCLUDE nonvolatile.ld +INCLUDE volatile-split.ld diff --git a/c_project/vexriscv/pqvexriscvsim_init.o b/c_project/vexriscv/pqvexriscvsim_init.o index da5c041b94d8b72eb0e69cadf39dcb7b0bc539e5..b1eecb83048ec31f79ede087e586f4cc20576f5d 100644 GIT binary patch literal 756 zcma)3!7>9u5PfSCc}# z<~dC7Ax+~xd*eGYk+oUU9ojfA#`;&Eg= zFCabuX6-B(8klIkJF|0_^_}mJ`aR3CNMO-BeKVrhIccVb3awC)E*>b2F>A-&ZriP# z=$@X2E{NMw4dw0Ez1o5DTFR?t0v)p8vyz6s7f>AN}3{atYWKk1Vm zX`_au`c3lv+c3EDeU`q+IT-oj3=*#^%SbA@i%c*em6$lomr}*yb)ZZ*Go;P}6ObAt z38~>Yioy}J^ng`hOsoetCQPvF|KP&LC$u=X^L@*Cu*C1g*g|mKK`|to gS>z5&sEY`h4JDmoAEpm6n^7buR}>;vjKUb{5b1PvfXUm&5slz^{^|N3ZWbd0>J^v@ou)wicPZh znyRTP5zDH?73C0)AUGl+q*m&6C3-J6j-VdO6>;H!fbZF!#I=y%NpI%+zIktc>^JtO z8=F^z5Ts1d?{vzDT2sl$THMuXnx0jmaes{9qfn5EeirkXI(l8FWAsONbux?K#Ul0o zd`MAMC;Q9yF}{JZ4SM|R!@u(Jy<7Lmw)8mW@$mlXI97XdNOYX(vEJWyZHCrgjMw~Z zT-s=@&ojPzI46L&<(QJ_I!W5c9J5&$;t#tzLw0SB?1g2r>m9Ni?~vW}$aZdE zKcQwy=K=Zn%($OvzxzYw)2~2TS7;^j(i>YI`Vbo>&VxUuOr_;zJYuL z`3CY0PNb}hLR9Y*Hyk>=fmNuozvK6s04K$mtmJ zVrWDcCkCG7)R?RmKbx$*kP> zl~K#xMMG2K%+s}#OUIkZRvv+CPlZS*S(8-AWhDH;NzlKKrzMT3WSq~ESi*VlS#Bws z#HIFumy;mIO6U7qc_z^rE1j1#&m}rz zrSqMxoJn-XO1FSb7GM@!={4X=daW5Ny$x)>iU!t(EB!KXg*OgktaQFZCKo%5vC=nz zD`#0HVyyHnVDoh}ur0XKw}C6qp@A`0`VMf}LIY#0^bv4*j#VPYO8*A9%-=H@W2Ju! zT((&yVyyHBz)SFH_+{MBGX6tsj8#k>y!3o5$M>$pFA8=QUYdzvd|ylaQGoHipP7we zT;ntR0$~>X4gA;GYH&Nf_KX)(ot*K(Zs2v%2Y%A;D1<@{$cgLPL0OaI_lKUt6`R8T zj(g4bcKe|GHFvxq@CV&bg8rD7{9neUg`=N*k=Alqg_O^waWdukIG%%T5k3X~uefEz zWY=wj|EwkfP9J&v4dy-YINKqf+nPqiSA}(UewUZvoQ|Q`EP!T;xl`v@PjQd=4z|iHF;o!xGgweO%u-Z@mY9&^-KWi5eB|vkeZs0 R%PSlA6ZZF^3PP{q{sDKH=}`ax delta 967 zcmZ9Ly-(Xv6veMY65=*c$Dr7JrwwgE(26gi4DH0iz`($O5E6tG35x_#6QNdWm5HHJ z2dcMp%$NaHLa0)tuIb*P-MaSQs5r;=L&jIS&%b-lv){|RFPFnz`?55<-7i6`1mle4 zz3kJbFiomkDy z^wjshA5R;1s)z;lk=;lu;irED_teky*-oSCoyg%kuPIHxdb)Rb()8bp=f7R6*6Rn= z+A&|^z8r@Xe$9<}xC`4K-*!F)X!cK2QD4svYxL=2c2$N?n-c7rUSm hk_TQyrjcC6MD`(de1P#u{V~g~p!+-q9sCrom + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >rom + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >rom + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + . = ALIGN(4); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >rom + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >rom + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >rom + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >rom + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >rom + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >rom + + /* RODATA is usally in ROM, however in volatile configurations this doesn't + make a lot of sense. */ + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); +} + +PROVIDE(_sp = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_heap_end = ORIGIN(ram) + LENGTH(ram)); diff --git a/c_project/volatile-split.ld b/c_project/volatile-split.ld new file mode 100644 index 0000000..00d8d89 --- /dev/null +++ b/c_project/volatile-split.ld @@ -0,0 +1,137 @@ +/* SECTIONS for volatile chip configuration, i.e. chips without flash */ + +SECTIONS +{ + .init : + { + KEEP (*(SORT_NONE(.init))) + } >rom + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >rom + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >rom + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + . = ALIGN(4); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >rom + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >rom + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >rom + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >rom + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >rom + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >rom + + /* RODATA is usally in ROM, however in volatile configurations this doesn't + make a lot of sense. */ + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); +} + +PROVIDE(_sp = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_heap_end = ORIGIN(ram) + LENGTH(ram)); diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/Makefile b/c_project_sim_and_ulx3s/bsp/vexriscv/Makefile new file mode 100644 index 0000000..e5a6cc3 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/Makefile @@ -0,0 +1,54 @@ +PLATFORM ?= murax +RISCV_ARCH ?= rv32im +RISCV_ABI ?= ilp32 +RISCV_CMODEL ?= medany +RISCV_ARCHFLAGS += -march=$(RISCV_ARCH) +RISCV_ARCHFLAGS += -mabi=$(RISCV_ABI) +RISCV_ARCHFLAGS += -mcmodel=$(RISCV_CMODEL) + +CFLAGS += -Os -Wall -Wextra +CFLAGS += $(RISCV_ARCHFLAGS) +CFLAGS += -fstrict-volatile-bitfields +CFLAGS += --specs=nosys.specs + +ifeq ($(PLATFORM),murax) +CFLAGS += -DVEXRISCV_VOLATILE +endif + +ifeq ($(PLATFORM),pqvexriscvup5k) +CFLAGS += -DVEXRISCV_VOLATILE -DVEXRISCV_RWMTVEC +endif + +ifeq ($(PLATFORM),pqvexriscvicoboard) +CFLAGS += -DVEXRISCV_VOLATILE -DVEXRISCV_RWMTVEC +endif + +ifeq ($(PLATFORM),pqvexriscvsim) +CFLAGS += -DVEXRISCV_RWMTVEC +endif + +ifeq ($(PLATFORM),pqvexriscvsimhuge) +CFLAGS += -DVEXRISCV_RWMTVEC +endif + +CROSS_PREFIX ?= riscv64-unknown-elf +CC = $(CROSS_PREFIX)-gcc +AR = $(CROSS_PREFIX)-ar + +SRCS = init.c start.s +OBJS = $(PLATFORM)_init.o $(PLATFORM)_start.o +TARGET = lib$(PLATFORM)bsp.a + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(AR) rcs $@ $^ + +$(PLATFORM)_%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +$(PLATFORM)_%.o: %.S + $(CC) $(CFLAGS) -c -o $@ $< + +clean: + rm -rf $(OBJS) $(TARGET) diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/init.c b/c_project_sim_and_ulx3s/bsp/vexriscv/init.c new file mode 100644 index 0000000..29eb940 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/init.c @@ -0,0 +1,8 @@ +#include "weak_under_alias.h" + +void __weak__init() {} + +void __weak__fini() {} + +weak_under_alias(_init); +weak_under_alias(_fini); diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/libpqvexriscvup5kbsp.a b/c_project_sim_and_ulx3s/bsp/vexriscv/libpqvexriscvup5kbsp.a new file mode 100644 index 0000000000000000000000000000000000000000..e276644b5481ceb3fb84190961d1a52d3eddc09e GIT binary patch literal 3348 zcmbtWU2has7=CAFr&B6uyG6GOn%U0MFUsskOIr*vyJF#nXf!cuVqB)n0vopNGCLp` z61y2mxZuWM!mZwWfr>|OBCwb3#zvrEE-Z^vfCq2J$ z>8**PJ&f{NxxBu*x^ZI7wo8#IJ=%7;6w9`KZbC#X5$)hGW!@2qsb2rQ>0PeZTRW{l zk}*+TfKKZ1*bO{Ckihpk_2y3C-;kDn<&@WMZ+VT&QXDOCxZJ0t)eWUOH_^Frt$E#V zbsN{Nc8*_;3UGIeqw47K)K3)Et0gJYYk~KMbug~2t=jhbaV%1Va}!@~o;|H;8kQu6 zCcn!QN#sr88lH!8q^+4S7Uf_wl)$NMg*xlYnvxpn5k?RG4-`ctw zG`mSz|7bb{FRt5I;?2EL?@5(fg*Bi;`!gpkIAN}?`6Ndkg7oB9*Vfz(8l8T6YTH>CW5_y0g&Nou!Am zv;4E}xQ}$l)=b2kh&K^$BHl#2iFgz7CgLr`TZp$1Zz0}7yoGoR@s_GDv}BKZUo#4t9u{i4aiph*NBX)kry1c~%`oPBMmXO$j0G(dF4Qu{VlNXe z_A|zkW`;{O(>U5Q!=ruESk}hE<=U8WtTz@O>yH_(W`%CeGKxJbEcPv|<#<=@64xdT z{3Ie6Uwk0iO-(y=K)2XO>`R^%Y1G)1$>BExcI4G*aFikv|%dKO2!dBl0IB@>R&+Bsv@Q?SWVC zM_JsnB^yIUFJmkxV_yEHjrJ&|LW$9;^WOKbJH%`4uVw?&VC<9ORXr z>zLz@5+JYiOfkd586dCp-18j&{s4KU=l3$h+ZRAy=}X{qIcnqmRr*!PGs!1IUg|OXTK#LeH)+sDjNU7rnR-DhC91HFREH+rA>6h(ckoG>fDzW{%4R3`uc literal 0 HcmV?d00001 diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/main.c b/c_project_sim_and_ulx3s/bsp/vexriscv/main.c new file mode 100644 index 0000000..7783f33 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/main.c @@ -0,0 +1,29 @@ +#include +#include "hal.h" + +// typedef struct { +// volatile uint32_t state; +// } My_Mem; + +// #define MY_MEM ((My_Mem*)(0xF0030000)) + +int main(void) +{ + printf("HELLO WORLD\n"); + + uint32_t state = 10000; + // uint32_t state_return; + + while (1) + { + printf("State in : %i\n", state); + + // MY_MEM->state = state; + // state_return = MY_MEM->state; + + state = state + 1; + + printf("State out: %i\n", state); + } + return 0; +} diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/murax.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/murax.ld new file mode 100644 index 0000000..7e57145 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/murax.ld @@ -0,0 +1,11 @@ +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) + +ENTRY( _start ) + +MEMORY +{ + ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 8k +} + +INCLUDE volatile.ld diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/nonvolatile.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/nonvolatile.ld new file mode 100644 index 0000000..0809fad --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/nonvolatile.ld @@ -0,0 +1,141 @@ +/* SECTIONS for non-volatile chip configuration, i.e. chips with flash */ + +SECTIONS +{ + .init : + { + KEEP (*(SORT_NONE(.init))) + } >rom + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >rom + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >rom + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >rom + + . = ALIGN(4); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >rom + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >rom + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >rom + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >rom + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >rom + + .lalign : + { + . = ALIGN(4); + } >rom + + .dalign : + { + . = ALIGN(4); + } >ram AT>rom + + .data : + { + PROVIDE( _data = . ); + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + } >ram AT>rom + + PROVIDE( _data_lma = LOADADDR(.data) ); + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); +} + +PROVIDE(_sp = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_heap_end = ORIGIN(ram) + LENGTH(ram)); diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvicoboard.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvicoboard.ld new file mode 100644 index 0000000..416e341 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvicoboard.ld @@ -0,0 +1,11 @@ +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) + +ENTRY( _start ) + +MEMORY +{ +ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 1024K +} + +INCLUDE volatile.ld diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsim.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsim.ld new file mode 100644 index 0000000..1d34047 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsim.ld @@ -0,0 +1,14 @@ +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) + +ENTRY( _start ) + +__ram_size = 384K; + +MEMORY +{ + rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 256K + ram (wxa!ri) : ORIGIN = 0x80040000, LENGTH = 128K +} + +INCLUDE nonvolatile.ld diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsimhuge.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsimhuge.ld new file mode 100644 index 0000000..4f2b70e --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvsimhuge.ld @@ -0,0 +1,14 @@ +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) + +ENTRY( _start ) + +__ram_size = 16M; + +MEMORY +{ +rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 8M +ram (wxa!ri) : ORIGIN = 0x80800000, LENGTH = 8M +} + +INCLUDE nonvolatile.ld diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k.ld new file mode 100644 index 0000000..e9b0619 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k.ld @@ -0,0 +1,14 @@ +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) + +ENTRY( _start ) + +__ram_size = 128K; + +MEMORY +{ + rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K + ram (wxa!ri) : ORIGIN = 0x80010000, LENGTH = 64K +} + +INCLUDE volatile-split.ld diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k_init.o b/c_project_sim_and_ulx3s/bsp/vexriscv/pqvexriscvup5k_init.o new file mode 100644 index 0000000000000000000000000000000000000000..b1eecb83048ec31f79ede087e586f4cc20576f5d GIT binary patch literal 756 zcma)3!7>9u5PfSCc}# z<~dC7Ax+~xd*eGYk+oUU9ojfA#`;&=`ZjwrAB@Sz$^wbMn014IdrrXwHlWc9b zYEUI&nMyhIf{K(Y+&O?m|A74y_zyrFxPrKF0={Q^5_eSzp7dtE_q`t;&peO6*uHr~ z2th^!{Yj@5(T{Vv=V~@}=`6i!LbLf8!Os#w4a^Iu(@>a|qGQa@o+#RR^qh1{f!n5E z$It&h@gw`UL!#r-jQoFer$$?EWHpYW>UMu?iSd)esH*x4ToYi>T@@?eX$hVPiBi}abOIt3<#e~wuDap1FY1{5-VMrT5?&)blH`1C6VdMRLZWXq+PcnFC~@q(zGI1g-TalCD#&_u1%Hf ziMh1r&dJNkTzYvrCmms@j%&*+iJe}V+Stqah+2K#o3flQ4EgzoBpwTK;hbgjc~_wq z%Yndd8$%dGI}b@T0af^Lb0gT8^u1jSG%wD)*b6i1IGJ)M5p3&)5DBI%k}5M9xqWmJ z^m70FjGx~nmpq==Ubg$j#Phhl%l28=osz!}{AJ1JTHl7v?nz1J{_9rv;1K3{|Tnpz;4+{o}IdEVXe{?H$Lll@>X9)%t9q6yex6nRnXhcS7hz1twh!EndB6YK?^ zABO$``SIvc0B`O99~X{YKiH!<^e0G+!vhM!`|tbX@zCG-EL&xRKXeH1eACV#cA2PA zG&bYSoW@;+n4&ot8=m*EfjfqUvEjKy^A%=^7#p6?yzwTp@IwvH-%Ilhv-!7U_&)4L zBcrqPHT+dj&Ek_`Z1`)ybuJ8HZ1@3i{VfcT0o3p@aQ$rz5XOdo3|zm!ED>YF9|5mH zc@NH`ckAx}6xhVHU{^T+(t}pdWiadg+G{!HzNo#P;})jtxQkgjP+j~d7_SsOInlvx z><=-=VLsn82Xt9EZX1K|G51k^f70 zEBI3_mPWkiW#JxTS%h+&xs7Jy*vGO0<#zh7xOK#opF4p4y(t3BJ;%cP%xf4xS-yku z6mi^w%(L>5ya(lUb9?>{gL92=9LpAz@c_zl4KLoo%=LH=OuZYxc!vq5OfI6ZHU?(1 v)bcagJwV*gAi3rFUgUcGE?nR22_UuLc*>v}^|1-UY~ua}Qp3eg literal 0 HcmV?d00001 diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/start.S b/c_project_sim_and_ulx3s/bsp/vexriscv/start.S new file mode 100644 index 0000000..105b7e8 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/start.S @@ -0,0 +1,156 @@ + .section .init + .global _start + .type _start,@function +_start: +#ifndef VEXRISCV_RWMTVEC + j _crtInit + nop + nop + nop + nop + nop + nop + nop + j trap_entry +_crtInit: +#endif + .cfi_startproc + .cfi_undefined ra +.option push +.option norelax + la gp, __global_pointer$ +.option pop + la sp, _sp + +#ifndef VEXRISCV_VOLATILE + /* Load data section */ + la a0, _data_lma + la a1, _data + la a2, _edata + bgeu a1, a2, 2f +1: + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: +#endif + + /* Clear bss section */ + la a0, __bss_start + la a1, _end + bgeu a0, a1, 2f +1: + sw zero, (a0) + addi a0, a0, 4 + bltu a0, a1, 1b +2: + + /* Call global constructors */ + la a0, __libc_fini_array + call atexit + call __libc_init_array + + auipc ra, 0 + addi sp, sp, -16 + sw ra, 8(sp) + + /* Enable Interrupts and set trap vector */ +#ifndef VEXRISCV_RWMTVEC + la a0, trap_entry + csrw mtvec, a0 +#endif + li a0, 0x880 //880 enable timer + external interrupts + csrw mie, a0 + li a0, 0x1808 //1808 enable interrupts + csrw mstatus, a0 + + /* argc = argv = 0 */ + li a0, 0 + li a1, 0 + call main + tail exit +1: + j 1b + .cfi_endproc + + .align 4 + .weak trap_entry + .global trap_entry +trap_entry: + addi sp, sp, -32*4 + + sw x1, 1*4(sp) + sw x2, 2*4(sp) + sw x3, 3*4(sp) + sw x4, 4*4(sp) + sw x5, 5*4(sp) + sw x6, 6*4(sp) + sw x7, 7*4(sp) + sw x8, 8*4(sp) + sw x9, 9*4(sp) + sw x10, 10*4(sp) + sw x11, 11*4(sp) + sw x12, 12*4(sp) + sw x13, 13*4(sp) + sw x14, 14*4(sp) + sw x15, 15*4(sp) + sw x16, 16*4(sp) + sw x17, 17*4(sp) + sw x18, 18*4(sp) + sw x19, 19*4(sp) + sw x20, 20*4(sp) + sw x21, 21*4(sp) + sw x22, 22*4(sp) + sw x23, 23*4(sp) + sw x24, 24*4(sp) + sw x25, 25*4(sp) + sw x26, 26*4(sp) + sw x27, 27*4(sp) + sw x28, 28*4(sp) + sw x29, 29*4(sp) + sw x30, 30*4(sp) + sw x31, 31*4(sp) + + call irqCallback + + lw x1, 1*4(sp) + lw x2, 2*4(sp) + lw x3, 3*4(sp) + lw x4, 4*4(sp) + lw x5, 5*4(sp) + lw x6, 6*4(sp) + lw x7, 7*4(sp) + lw x8, 8*4(sp) + lw x9, 9*4(sp) + lw x10, 10*4(sp) + lw x11, 11*4(sp) + lw x12, 12*4(sp) + lw x13, 13*4(sp) + lw x14, 14*4(sp) + lw x15, 15*4(sp) + lw x16, 16*4(sp) + lw x17, 17*4(sp) + lw x18, 18*4(sp) + lw x19, 19*4(sp) + lw x20, 20*4(sp) + lw x21, 21*4(sp) + lw x22, 22*4(sp) + lw x23, 23*4(sp) + lw x24, 24*4(sp) + lw x25, 25*4(sp) + lw x26, 26*4(sp) + lw x27, 27*4(sp) + lw x28, 28*4(sp) + lw x29, 29*4(sp) + lw x30, 30*4(sp) + lw x31, 31*4(sp) + + addi sp, sp, 32*4 + mret + + .weak irqCallback +irqCallback: +1: + j 1b diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/volatile-split.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/volatile-split.ld new file mode 100644 index 0000000..00d8d89 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/volatile-split.ld @@ -0,0 +1,137 @@ +/* SECTIONS for volatile chip configuration, i.e. chips without flash */ + +SECTIONS +{ + .init : + { + KEEP (*(SORT_NONE(.init))) + } >rom + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >rom + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >rom + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + . = ALIGN(4); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >rom + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >rom + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >rom + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >rom + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >rom + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >rom + + /* RODATA is usally in ROM, however in volatile configurations this doesn't + make a lot of sense. */ + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); +} + +PROVIDE(_sp = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_heap_end = ORIGIN(ram) + LENGTH(ram)); diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/volatile.ld b/c_project_sim_and_ulx3s/bsp/vexriscv/volatile.ld new file mode 100644 index 0000000..a27a221 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/volatile.ld @@ -0,0 +1,137 @@ +/* SECTIONS for volatile chip configuration, i.e. chips without flash */ + +SECTIONS +{ + .init : + { + KEEP (*(SORT_NONE(.init))) + } >ram + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >ram + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >ram + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + . = ALIGN(4); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >ram + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >ram + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >ram + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >ram + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >ram + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >ram + + /* RODATA is usally in ROM, however in volatile configurations this doesn't + make a lot of sense. */ + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); +} + +PROVIDE(_sp = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_heap_end = ORIGIN(ram) + LENGTH(ram)); diff --git a/c_project_sim_and_ulx3s/bsp/vexriscv/weak_under_alias.h b/c_project_sim_and_ulx3s/bsp/vexriscv/weak_under_alias.h new file mode 100644 index 0000000..4de2501 --- /dev/null +++ b/c_project_sim_and_ulx3s/bsp/vexriscv/weak_under_alias.h @@ -0,0 +1,7 @@ +#ifndef WEAK_UNDER_ALIAS_H +#define WEAK_UNDER_ALIAS_H + +#define weak_under_alias(name) \ + extern __typeof (__weak_##name) name __attribute__ ((weak, alias ("__weak_"#name))) + +#endif /* WEAK_UNDER_ALIAS_H */ diff --git a/c_project_sim_and_ulx3s/compile_command.txt b/c_project_sim_and_ulx3s/compile_command.txt new file mode 100644 index 0000000..3a4a7f5 --- /dev/null +++ b/c_project_sim_and_ulx3s/compile_command.txt @@ -0,0 +1 @@ +riscv64-unknown-elf-gcc -o main.elf -Os -g -Wall -Wextra -Wimplicit-function-declaration -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes -Wundef -Wshadow -fno-common -MD -DPQRISCV_PLATFORM=vexriscv -march=rv32im -mabi=ilp32 -mcmodel=medany -fstrict-volatile-bitfields -DVEXRISCV_PLATFORM=pqvexriscvup5k -DMUPQ_NAMESPACE= hal.c hal-vexriscv.c main.c memcpy.c memset.c printf.c -I"" --specs=nano.specs --specs=nosys.specs -Wl,-Tbsp/vexriscv/pqvexriscvup5k.ld -nostartfiles -ffreestanding -Wl,--gc-sections -Lbsp/vexriscv -Wl,--start-group -lpqvexriscvup5kbsp -lc -lm -Wl,--end-group diff --git a/c_project_sim_and_ulx3s/hal-vexriscv.c b/c_project_sim_and_ulx3s/hal-vexriscv.c new file mode 100644 index 0000000..29fa8e5 --- /dev/null +++ b/c_project_sim_and_ulx3s/hal-vexriscv.c @@ -0,0 +1,60 @@ +#include "hal.h" +#include + +/* Murax UART */ + +typedef struct { + volatile uint32_t DATA; + volatile uint32_t STATUS; + volatile uint32_t CLOCK_DIVIDER; + volatile uint32_t FRAME_CONFIG; +} Uart_Reg; + +enum UartParity { NONE = 0, EVEN = 1, ODD = 2 }; +enum UartStop { ONE = 0, TWO = 1 }; + +typedef struct { + uint32_t dataLength; + enum UartParity parity; + enum UartStop stop; + uint32_t clockDivider; +} Uart_Config; + +static uint32_t uart_writeAvailability(Uart_Reg* reg) +{ + return (reg->STATUS >> 16) & 0xFF; +} + +static void uart_write(Uart_Reg* reg, uint32_t data) +{ + while (uart_writeAvailability(reg) == 0) + ; + reg->DATA = data; +} + +#define UART ((Uart_Reg*)(0xF0010000)) + +void hal_send(const uint8_t* in, const size_t len) { + for (size_t i = 0; i < len; i++) { + uart_write(UART, in[i]); + } +} + +void hal_send_str(const char* in) +{ + const char* cur = in; + while(*cur) { + uart_write(UART, *cur); + cur += 1; + } +} + +__attribute__((naked)) uint64_t hal_get_time(void) +{ +#define LE "\n\t" + asm volatile (LE"csrr a1, mcycleh" + LE"csrr a0, mcycle" + LE"csrr a2, mcycleh" + LE"bne a1, a2, hal_get_time" + LE"ret"); +} diff --git a/c_project_sim_and_ulx3s/hal.c b/c_project_sim_and_ulx3s/hal.c new file mode 100644 index 0000000..2c43d0e --- /dev/null +++ b/c_project_sim_and_ulx3s/hal.c @@ -0,0 +1,21 @@ +#include + +#include +#include + +#include +#undef errno +extern int errno; + +#include "hal.h" + +void _putchar(char c) { + hal_send((uint8_t*)&c, 1); +} + +void _write(int fd, const void* ptr, size_t len) { + // Don't care about the fd. Just put everything on the UART console. + (void)fd; + hal_send(ptr, len); +} + diff --git a/c_project_sim_and_ulx3s/hal.h b/c_project_sim_and_ulx3s/hal.h new file mode 100644 index 0000000..217bb5b --- /dev/null +++ b/c_project_sim_and_ulx3s/hal.h @@ -0,0 +1,18 @@ +#ifndef VECRISCV_HAL_H_ +#define VECRISCV_HAL_H_ + +#include +#include +#include + +#define printf printf_ + +void hal_send(const uint8_t* in, const size_t len); +void hal_send_str(const char* in); + +int printf_(const char* format, ...); + +void _putchar(char c); +void _write(int fd, const void* ptr, size_t len); + +#endif /* VECRISCV_HAL_H_ */ diff --git a/c_project_sim_and_ulx3s/libpqvexriscvup5kbsp.a b/c_project_sim_and_ulx3s/libpqvexriscvup5kbsp.a new file mode 100644 index 0000000000000000000000000000000000000000..e276644b5481ceb3fb84190961d1a52d3eddc09e GIT binary patch literal 3348 zcmbtWU2has7=CAFr&B6uyG6GOn%U0MFUsskOIr*vyJF#nXf!cuVqB)n0vopNGCLp` z61y2mxZuWM!mZwWfr>|OBCwb3#zvrEE-Z^vfCq2J$ z>8**PJ&f{NxxBu*x^ZI7wo8#IJ=%7;6w9`KZbC#X5$)hGW!@2qsb2rQ>0PeZTRW{l zk}*+TfKKZ1*bO{Ckihpk_2y3C-;kDn<&@WMZ+VT&QXDOCxZJ0t)eWUOH_^Frt$E#V zbsN{Nc8*_;3UGIeqw47K)K3)Et0gJYYk~KMbug~2t=jhbaV%1Va}!@~o;|H;8kQu6 zCcn!QN#sr88lH!8q^+4S7Uf_wl)$NMg*xlYnvxpn5k?RG4-`ctw zG`mSz|7bb{FRt5I;?2EL?@5(fg*Bi;`!gpkIAN}?`6Ndkg7oB9*Vfz(8l8T6YTH>CW5_y0g&Nou!Am zv;4E}xQ}$l)=b2kh&K^$BHl#2iFgz7CgLr`TZp$1Zz0}7yoGoR@s_GDv}BKZUo#4t9u{i4aiph*NBX)kry1c~%`oPBMmXO$j0G(dF4Qu{VlNXe z_A|zkW`;{O(>U5Q!=ruESk}hE<=U8WtTz@O>yH_(W`%CeGKxJbEcPv|<#<=@64xdT z{3Ie6Uwk0iO-(y=K)2XO>`R^%Y1G)1$>BExcI4G*aFikv|%dKO2!dBl0IB@>R&+Bsv@Q?SWVC zM_JsnB^yIUFJmkxV_yEHjrJ&|LW$9;^WOKbJH%`4uVw?&VC<9ORXr z>zLz@5+JYiOfkd586dCp-18j&{s4KU=l3$h+ZRAy=}X{qIcnqmRr*!PGs!1IUg|OXTK#LeH)+sDjNU7rnR-DhC91HFREH+rA>6h(ckoG>fDzW{%4R3`uc literal 0 HcmV?d00001 diff --git a/c_project_sim_and_ulx3s/main.c b/c_project_sim_and_ulx3s/main.c new file mode 100644 index 0000000..7783f33 --- /dev/null +++ b/c_project_sim_and_ulx3s/main.c @@ -0,0 +1,29 @@ +#include +#include "hal.h" + +// typedef struct { +// volatile uint32_t state; +// } My_Mem; + +// #define MY_MEM ((My_Mem*)(0xF0030000)) + +int main(void) +{ + printf("HELLO WORLD\n"); + + uint32_t state = 10000; + // uint32_t state_return; + + while (1) + { + printf("State in : %i\n", state); + + // MY_MEM->state = state; + // state_return = MY_MEM->state; + + state = state + 1; + + printf("State out: %i\n", state); + } + return 0; +} diff --git a/c_project_sim_and_ulx3s/main.d b/c_project_sim_and_ulx3s/main.d new file mode 100644 index 0000000..71f3e08 --- /dev/null +++ b/c_project_sim_and_ulx3s/main.d @@ -0,0 +1,6 @@ +main.elf: printf.c \ + /opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/include/stdbool.h \ + /opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/include/stdint.h \ + /opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/include/stdint-gcc.h \ + printf.h /opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/include/stdarg.h \ + /opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/include/stddef.h diff --git a/c_project_sim_and_ulx3s/main.elf b/c_project_sim_and_ulx3s/main.elf new file mode 100755 index 0000000000000000000000000000000000000000..0cd5bf5f63a1148e4a82577cac2d3f0b94f7da40 GIT binary patch literal 41844 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 g!XrF=Yp(aPF*XJ|8hHrcA$ + +int +memcmp (const void *str1, const void *str2, size_t count) +{ + const unsigned char *s1 = str1; + const unsigned char *s2 = str2; + + while (count-- > 0) + { + if (*s1++ != *s2++) + return s1[-1] < s2[-1] ? -1 : 1; + } + return 0; +} diff --git a/c_project_sim_and_ulx3s/memcpy.c b/c_project_sim_and_ulx3s/memcpy.c new file mode 100644 index 0000000..39786ba --- /dev/null +++ b/c_project_sim_and_ulx3s/memcpy.c @@ -0,0 +1,61 @@ +/* Public domain. */ +#include + +/* +** Copyright 2001, Travis Geiselbrecht. All rights reserved. +** Distributed under the terms of the NewOS License. +*/ +/* + * Copyright (c) 2008 Travis Geiselbrecht + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include +#include + +typedef long word; +#define lsize sizeof(word) +#define lmask (lsize - 1) +void *memcpy(void *dest, const void *src, size_t count) +{ + char *d = (char *)dest; + const char *s = (const char *)src; + int len; + if(count == 0 || dest == src) + return dest; + if(((long)d | (long)s) & lmask) { + // src and/or dest do not align on word boundary + if((((long)d ^ (long)s) & lmask) || (count < lsize)) + len = count; // copy the rest of the buffer with the byte mover + else + len = lsize - ((long)d & lmask); // move the ptrs up to a word boundary + count -= len; + for(; len > 0; len--) + *d++ = *s++; + } + for(len = count / lsize; len > 0; len--) { + *(word *)d = *(word *)s; + d += lsize; + s += lsize; + } + for(len = count & lmask; len > 0; len--) + *d++ = *s++; + return dest; +} diff --git a/c_project_sim_and_ulx3s/memset.c b/c_project_sim_and_ulx3s/memset.c new file mode 100644 index 0000000..86efb6d --- /dev/null +++ b/c_project_sim_and_ulx3s/memset.c @@ -0,0 +1,64 @@ +/* +** Copyright 2005, Michael Noisternig. All rights reserved. +** Copyright 2001, Travis Geiselbrecht. All rights reserved. +** Distributed under the terms of the NewOS License. +*/ +/* + * Copyright (c) 2008 Travis Geiselbrecht + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include +#include + +// void * +// memset(void *s, int c, size_t count) +// { +// char *xs = (char *) s; +// // size_t len = (-(size_t)s) & (sizeof(size_t)-1); +// // int cc = c & 0xff; +// // if ( count > len ) { +// // count -= len; +// // cc |= cc << 8; +// // cc |= cc << 16; +// // // write to non-aligned memory byte-wise +// // for ( ; len > 0; len-- ) +// // *xs++ = c; +// // // write to aligned memory dword-wise +// // for ( len = count/sizeof(size_t); len > 0; len-- ) { +// // *((size_t *)xs) = cc; +// // xs += sizeof(size_t); +// // } +// // count &= sizeof(size_t)-1; +// // } +// // write remaining bytes +// for ( ; count > 0; count-- ) +// *xs++ = (char) c; +// return s; +// } + +void * +memset (void *dest, int val, size_t len) +{ + unsigned char *ptr = dest; + while (len-- > 0) + *ptr++ = (unsigned char) val; + return dest; +} \ No newline at end of file diff --git a/c_project_sim_and_ulx3s/pqvexriscvup5k.ld b/c_project_sim_and_ulx3s/pqvexriscvup5k.ld new file mode 100644 index 0000000..e9b0619 --- /dev/null +++ b/c_project_sim_and_ulx3s/pqvexriscvup5k.ld @@ -0,0 +1,14 @@ +OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") +OUTPUT_ARCH(riscv) + +ENTRY( _start ) + +__ram_size = 128K; + +MEMORY +{ + rom (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K + ram (wxa!ri) : ORIGIN = 0x80010000, LENGTH = 64K +} + +INCLUDE volatile-split.ld diff --git a/c_project_sim_and_ulx3s/printf.c b/c_project_sim_and_ulx3s/printf.c new file mode 100644 index 0000000..7bf7d74 --- /dev/null +++ b/c_project_sim_and_ulx3s/printf.c @@ -0,0 +1,987 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. These routines are thread +// safe and reentrant! +// Use this instead of the bloated standard/newlib printf cause these use +// malloc for printf (and may not be thread safe). +// +/////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include "printf.h" + + +// define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the +// printf_config.h header file +// default: undefined +#ifdef PRINTF_INCLUDE_CONFIG_H +#include "printf_config.h" +#endif + + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE +#define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE +#define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +// #ifndef PRINTF_DISABLE_SUPPORT_FLOAT +// #define PRINTF_SUPPORT_FLOAT +// #endif + +// support for exponential floating point notation (%e/%g) +// default: activated +// #ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL +// #define PRINTF_SUPPORT_EXPONENTIAL +// #endif + +// define the default floating point precision +// default: 6 digits +// #ifndef PRINTF_DEFAULT_FLOAT_PRECISION +// #define PRINTF_DEFAULT_FLOAT_PRECISION 6U +// #endif + +// define the largest float suitable to print with %f +// default: 1e9 +// #ifndef PRINTF_MAX_FLOAT +// #define PRINTF_MAX_FLOAT 1e9 +// #endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG +#define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +// #ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T +// #define PRINTF_SUPPORT_PTRDIFF_T +// #endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + + +// import float.h for DBL_MAX +// #if defined(PRINTF_SUPPORT_FLOAT) +// #include +// #endif + + +// output function type +typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen); + + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char character, void* arg); + void* arg; +} out_fct_wrap_type; + + +// Sometimes div modulo is not available, we implement one with shift/and/or +static int divmod(int* Qptr, int* Rptr, const int N, const int D) { + if (D == 0) { + return -1; + } + + int Q = 0; + int R = 0; + for (int i = 8*sizeof(int) - 1; i >= 0; i--) { + R <<= 1; + R |= (N >> i) & 0x1; + if (R >= D) { + R -= D; + Q |= 1 << i; + } + } + *Qptr = Q; + *Rptr = R; + return 0; +} + +// Sometimes div modulo is not available, we implement one with shift/and/or +static int divmod_long_long(long long* Qptr, long long* Rptr, const long long N, const int D) { + if (D == 0) { + return -1; + } + + long long Q = 0; + long long R = 0; + for (long long i = 8*sizeof(long long) - 1; i >= 0; i--) { + R <<= 1; + R |= (N >> i) & 0x1; + if (R >= D) { + R -= D; + Q |= 1 << i; + } + } + *Qptr = Q; + *Rptr = R; + return 0; +} + + +// internal buffer output +static inline void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen) +{ + if (idx < maxlen) { + ((char*)buffer)[idx] = character; + } +} + + +// internal null output +static inline void _out_null(char character, void* buffer, size_t idx, size_t maxlen) +{ + (void)character; (void)buffer; (void)idx; (void)maxlen; +} + + +// internal _putchar wrapper +static inline void _out_char(char character, void* buffer, size_t idx, size_t maxlen) +{ + (void)buffer; (void)idx; (void)maxlen; + if (character) { + _putchar(character); + } +} + + +// internal output function wrapper +static inline void _out_fct(char character, void* buffer, size_t idx, size_t maxlen) +{ + (void)idx; (void)maxlen; + if (character) { + // buffer is the output fct pointer + ((out_fct_wrap_type*)buffer)->fct(character, ((out_fct_wrap_type*)buffer)->arg); + } +} + + +// internal secure strlen +// \return The length of the string (excluding the terminating 0) limited by 'maxsize' +static inline unsigned int _strnlen_s(const char* str, size_t maxsize) +{ + const char* s; + for (s = str; *s && maxsize--; ++s); + return (unsigned int)(s - str); +} + + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) +{ + return (ch >= '0') && (ch <= '9'); +} + + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char** str) +{ + unsigned int i = 0U; + while (_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type out, char* buffer, size_t idx, size_t maxlen, const char* buf, size_t len, unsigned int width, unsigned int flags) +{ + const size_t start_idx = idx; + + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + while (len) { + out(buf[--len], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + + +// internal itoa format +static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, char* buf, size_t len, bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +{ + // pad leading zeros + if (!(flags & FLAGS_LEFT)) { + if (width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while ((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + // handle hash + if (flags & FLAGS_HASH) { + if (!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { + len--; + if (len && (base == 16U)) { + len--; + } + } + if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if (len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + if (len < PRINTF_NTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } + else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + + +// internal itoa for 'long' type +static size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + int q, r; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + q = 0, r = 0; + len = 0; + do { + divmod(&q, &r, value, base); + const char digit = (char)(r); + // buf[idx2++] = '0' + digit; + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value = q; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + // while (idx2 > 0) { + // _putchar(buf[--idx2]); + // written++; + // } + // idx++; + + + + // do { + // const char digit = (char)(value % base); + // buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + // value /= base; + // } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} + + +// // internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long long value, bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + long long q, r; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + q = 0, r = 0; + len = 0; + do { + divmod_long_long(&q, &r, value, base); + const char digit = (char)(r); + // buf[idx2++] = '0' + digit; + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value = q; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + + + // do { + // const char digit = (char)(value % base); + // buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + // value /= base; + // } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + + +// #if defined(PRINTF_SUPPORT_FLOAT) +// +// #if defined(PRINTF_SUPPORT_EXPONENTIAL) +// // forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT +// static size_t _etoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags); +// #endif +// +// +// // internal ftoa for fixed decimal floating point +// static size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +// { +// char buf[PRINTF_FTOA_BUFFER_SIZE]; +// size_t len = 0U; +// double diff = 0.0; +// +// // powers of 10 +// static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; +// +// // test for special values +// if (value != value) +// return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); +// if (value < -DBL_MAX) +// return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); +// if (value > DBL_MAX) +// return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, flags); +// +// // test for very large values +// // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad +// if ((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { +// #if defined(PRINTF_SUPPORT_EXPONENTIAL) +// return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); +// #else +// return 0U; +// #endif +// } +// +// // test for negative +// bool negative = false; +// if (value < 0) { +// negative = true; +// value = 0 - value; +// } +// +// // set default precision, if not set explicitly +// if (!(flags & FLAGS_PRECISION)) { +// prec = PRINTF_DEFAULT_FLOAT_PRECISION; +// } +// // limit precision to 9, cause a prec >= 10 can lead to overflow errors +// while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { +// buf[len++] = '0'; +// prec--; +// } +// +// int whole = (int)value; +// double tmp = (value - whole) * pow10[prec]; +// unsigned long frac = (unsigned long)tmp; +// diff = tmp - frac; +// +// if (diff > 0.5) { +// ++frac; +// // handle rollover, e.g. case 0.99 with prec 1 is 1.0 +// if (frac >= pow10[prec]) { +// frac = 0; +// ++whole; +// } +// } +// else if (diff < 0.5) { +// } +// else if ((frac == 0U) || (frac & 1U)) { +// // if halfway, round up if odd OR if last digit is 0 +// ++frac; +// } +// +// if (prec == 0U) { +// diff = value - (double)whole; +// if ((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { +// // exactly 0.5 and ODD, then round up +// // 1.5 -> 2, but 2.5 -> 2 +// ++whole; +// } +// } +// else { +// unsigned int count = prec; +// // now do fractional part, as an unsigned number +// while (len < PRINTF_FTOA_BUFFER_SIZE) { +// --count; +// buf[len++] = (char)(48U + (frac % 10U)); +// if (!(frac /= 10U)) { +// break; +// } +// } +// // add extra 0s +// while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { +// buf[len++] = '0'; +// } +// if (len < PRINTF_FTOA_BUFFER_SIZE) { +// // add decimal +// buf[len++] = '.'; +// } +// } +// +// // do whole part, number is reversed +// while (len < PRINTF_FTOA_BUFFER_SIZE) { +// buf[len++] = (char)(48 + (whole % 10)); +// if (!(whole /= 10)) { +// break; +// } +// } +// +// // pad leading zeros +// if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { +// if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { +// width--; +// } +// while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { +// buf[len++] = '0'; +// } +// } +// +// if (len < PRINTF_FTOA_BUFFER_SIZE) { +// if (negative) { +// buf[len++] = '-'; +// } +// else if (flags & FLAGS_PLUS) { +// buf[len++] = '+'; // ignore the space if the '+' exists +// } +// else if (flags & FLAGS_SPACE) { +// buf[len++] = ' '; +// } +// } +// +// return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +// } +// +// +// #if defined(PRINTF_SUPPORT_EXPONENTIAL) +// // internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse +// static size_t _etoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +// { +// // check for NaN and special values +// if ((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { +// return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); +// } +// +// // determine the sign +// const bool negative = value < 0; +// if (negative) { +// value = -value; +// } +// +// // default precision +// if (!(flags & FLAGS_PRECISION)) { +// prec = PRINTF_DEFAULT_FLOAT_PRECISION; +// } +// +// // determine the decimal exponent +// // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) +// union { +// uint64_t U; +// double F; +// } conv; +// +// conv.F = value; +// int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 +// conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) +// // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 +// int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); +// // now we want to compute 10^expval but we want to be sure it won't overflow +// exp2 = (int)(expval * 3.321928094887362 + 0.5); +// const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; +// const double z2 = z * z; +// conv.U = (uint64_t)(exp2 + 1023) << 52U; +// // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex +// conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); +// // correct for rounding errors +// if (value < conv.F) { +// expval--; +// conv.F /= 10; +// } +// +// // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters +// unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; +// +// // in "%g" mode, "prec" is the number of *significant figures* not decimals +// if (flags & FLAGS_ADAPT_EXP) { +// // do we want to fall-back to "%f" mode? +// if ((value >= 1e-4) && (value < 1e6)) { +// if ((int)prec > expval) { +// prec = (unsigned)((int)prec - expval - 1); +// } +// else { +// prec = 0; +// } +// flags |= FLAGS_PRECISION; // make sure _ftoa respects precision +// // no characters in exponent +// minwidth = 0U; +// expval = 0; +// } +// else { +// // we use one sigfig for the whole part +// if ((prec > 0) && (flags & FLAGS_PRECISION)) { +// --prec; +// } +// } +// } +// +// // will everything fit? +// unsigned int fwidth = width; +// if (width > minwidth) { +// // we didn't fall-back so subtract the characters required for the exponent +// fwidth -= minwidth; +// } else { +// // not enough characters, so go back to default sizing +// fwidth = 0U; +// } +// if ((flags & FLAGS_LEFT) && minwidth) { +// // if we're padding on the right, DON'T pad the floating part +// fwidth = 0U; +// } +// +// // rescale the float value +// if (expval) { +// value /= conv.F; +// } +// +// // output the floating part +// const size_t start_idx = idx; +// idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); +// +// // output the exponent part +// if (minwidth) { +// // output the exponential symbol +// out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); +// // output the exponent value +// idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth-1, FLAGS_ZEROPAD | FLAGS_PLUS); +// // might need to right-pad spaces +// if (flags & FLAGS_LEFT) { +// while (idx - start_idx < width) out(' ', buffer, idx++, maxlen); +// } +// } +// return idx; +// } +// #endif // PRINTF_SUPPORT_EXPONENTIAL +// #endif // PRINTF_SUPPORT_FLOAT + + +// internal vsnprintf +static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va) +{ + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if (!buffer) { + // use null output function + out = _out_null; + } + + while (*format) + { + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } + else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch (*format) { + case '0': flags |= FLAGS_ZEROPAD; format++; n = 1U; break; + case '-': flags |= FLAGS_LEFT; format++; n = 1U; break; + case '+': flags |= FLAGS_PLUS; format++; n = 1U; break; + case ' ': flags |= FLAGS_SPACE; format++; n = 1U; break; + case '#': flags |= FLAGS_HASH; format++; n = 1U; break; + default : n = 0U; break; + } + } while (n); + + // evaluate width field + width = 0U; + if (_is_digit(*format)) { + width = _atoi(&format); + } + else if (*format == '*') { + const int w = va_arg(va, int); + if (w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int)-w; + } + else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if (*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if (_is_digit(*format)) { + precision = _atoi(&format); + } + else if (*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } + } + + // evaluate length field + switch (*format) { + case 'l' : + flags |= FLAGS_LONG; + format++; + if (*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h' : + flags |= FLAGS_SHORT; + format++; + if (*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +// #if defined(PRINTF_SUPPORT_PTRDIFF_T) +// case 't' : +// flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); +// format++; +// break; +// #endif + case 'j' : + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z' : + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default : + break; + } + + // evaluate specifier + switch (*format) { + case 'd' : + case 'i' : + case 'u' : + case 'x' : + case 'X' : + case 'o' : + case 'b' : { + // set the base + unsigned int base; + if (*format == 'x' || *format == 'X') { + base = 16U; + } + else if (*format == 'o') { + base = 8U; + } + else if (*format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if (*format == 'X') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if ((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if (flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if ((*format == 'i') || (*format == 'd')) { + // signed + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + } + else { + const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + } + } + else { + // unsigned + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); + } + else { + const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); + } + } + format++; + break; + } +// #if defined(PRINTF_SUPPORT_FLOAT) +// case 'f' : +// case 'F' : +// if (*format == 'F') flags |= FLAGS_UPPERCASE; +// idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); +// format++; +// break; +// #if defined(PRINTF_SUPPORT_EXPONENTIAL) +// case 'e': +// case 'E': +// case 'g': +// case 'G': +// if ((*format == 'g')||(*format == 'G')) flags |= FLAGS_ADAPT_EXP; +// if ((*format == 'E')||(*format == 'G')) flags |= FLAGS_UPPERCASE; +// idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); +// format++; +// break; +// #endif // PRINTF_SUPPORT_EXPONENTIAL +// #endif // PRINTF_SUPPORT_FLOAT + case 'c' : { + unsigned int l = 1U; + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's' : { + const char* p = va_arg(va, char*); + unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 'p' : { + width = sizeof(void*) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; +#if defined(PRINTF_SUPPORT_LONG_LONG) + const bool is_ll = sizeof(uintptr_t) == sizeof(long long); + if (is_ll) { + idx = _ntoa_long_long(out, buffer, idx, maxlen, (uintptr_t)va_arg(va, void*), false, 16U, precision, width, flags); + } + else { +#endif + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)((uintptr_t)va_arg(va, void*)), false, 16U, precision, width, flags); +#if defined(PRINTF_SUPPORT_LONG_LONG) + } +#endif + format++; + break; + } + + case '%' : + out('%', buffer, idx++, maxlen); + format++; + break; + + default : + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + + +/////////////////////////////////////////////////////////////////////////////// + +int printf_(const char* format, ...) +{ + va_list va; + va_start(va, format); + char buffer[1]; + const int ret = _vsnprintf(_out_char, buffer, (size_t)-1, format, va); + va_end(va); + return ret; +} + + +int sprintf_(char* buffer, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, (size_t)-1, format, va); + va_end(va); + return ret; +} + + +int snprintf_(char* buffer, size_t count, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; +} + + +int vprintf_(const char* format, va_list va) +{ + char buffer[1]; + return _vsnprintf(_out_char, buffer, (size_t)-1, format, va); +} + + +int vsnprintf_(char* buffer, size_t count, const char* format, va_list va) +{ + return _vsnprintf(_out_buffer, buffer, count, format, va); +} + + +int fctprintf(void (*out)(char character, void* arg), void* arg, const char* format, ...) +{ + va_list va; + va_start(va, format); + const out_fct_wrap_type out_fct_wrap = { out, arg }; + const int ret = _vsnprintf(_out_fct, (char*)(uintptr_t)&out_fct_wrap, (size_t)-1, format, va); + va_end(va); + return ret; +} diff --git a/c_project_sim_and_ulx3s/printf.h b/c_project_sim_and_ulx3s/printf.h new file mode 100644 index 0000000..165f348 --- /dev/null +++ b/c_project_sim_and_ulx3s/printf.h @@ -0,0 +1,121 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. +// Use this instead of bloated standard/newlib printf. +// These routines are thread safe and reentrant. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _PRINTF_H_ +#define _PRINTF_H_ + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +#define PRINTF_DISABLE_SUPPORT_FLOAT +#define PRINTF_DISABLE_SUPPORT_EXPONENTIAL +// #define PRINTF_DISABLE_SUPPORT_LONG_LONG +#define PRINTF_DISABLE_SUPPORT_PTRDIFF_T + +/** + * Output a character to a custom device like UART, used by the printf() function + * This function is declared here only. You have to write your custom implementation somewhere + * \param character Character to output + */ +void _putchar(char character); + + +/** + * Tiny printf implementation + * You have to implement _putchar if you use printf() + * To avoid conflicts with the regular printf() API it is overridden by macro defines + * and internal underscore-appended functions like printf_() are used + * \param format A string that specifies the format of the output + * \return The number of characters that are written into the array, not counting the terminating null character + */ +#define printf printf_ +int printf_(const char* format, ...); + + +/** + * Tiny sprintf implementation + * Due to security reasons (buffer overflow) YOU SHOULD CONSIDER USING (V)SNPRINTF INSTEAD! + * \param buffer A pointer to the buffer where to store the formatted string. MUST be big enough to store the output! + * \param format A string that specifies the format of the output + * \return The number of characters that are WRITTEN into the buffer, not counting the terminating null character + */ +#define sprintf sprintf_ +int sprintf_(char* buffer, const char* format, ...); + + +/** + * Tiny snprintf/vsnprintf implementation + * \param buffer A pointer to the buffer where to store the formatted string + * \param count The maximum number of characters to store in the buffer, including a terminating null character + * \param format A string that specifies the format of the output + * \param va A value identifying a variable arguments list + * \return The number of characters that COULD have been written into the buffer, not counting the terminating + * null character. A value equal or larger than count indicates truncation. Only when the returned value + * is non-negative and less than count, the string has been completely written. + */ +#define snprintf snprintf_ +#define vsnprintf vsnprintf_ +int snprintf_(char* buffer, size_t count, const char* format, ...); +int vsnprintf_(char* buffer, size_t count, const char* format, va_list va); + + +/** + * Tiny vprintf implementation + * \param format A string that specifies the format of the output + * \param va A value identifying a variable arguments list + * \return The number of characters that are WRITTEN into the buffer, not counting the terminating null character + */ +#define vprintf vprintf_ +int vprintf_(const char* format, va_list va); + + +/** + * printf with output function + * You may use this as dynamic alternative to printf() with its fixed _putchar() output + * \param out An output function which takes one character and an argument pointer + * \param arg An argument pointer for user data passed to output function + * \param format A string that specifies the format of the output + * \return The number of characters that are sent to the output function, not counting the terminating null character + */ +int fctprintf(void (*out)(char character, void* arg), void* arg, const char* format, ...); + + +#ifdef __cplusplus +} +#endif + + +#endif // _PRINTF_H_ diff --git a/c_project_sim_and_ulx3s/volatile-split.ld b/c_project_sim_and_ulx3s/volatile-split.ld new file mode 100644 index 0000000..00d8d89 --- /dev/null +++ b/c_project_sim_and_ulx3s/volatile-split.ld @@ -0,0 +1,137 @@ +/* SECTIONS for volatile chip configuration, i.e. chips without flash */ + +SECTIONS +{ + .init : + { + KEEP (*(SORT_NONE(.init))) + } >rom + + .text : + { + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >rom + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >rom + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + . = ALIGN(4); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >rom + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >rom + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >rom + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >rom + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >rom + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >rom + + /* RODATA is usally in ROM, however in volatile configurations this doesn't + make a lot of sense. */ + .rodata : + { + *(.rdata) + *(.rodata .rodata.*) + *(.gnu.linkonce.r.*) + } >ram + + .data : + { + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); + PROVIDE( __bss_start = . ); + + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram + + . = ALIGN(8); + PROVIDE( _end = . ); + PROVIDE( end = . ); +} + +PROVIDE(_sp = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_heap_end = ORIGIN(ram) + LENGTH(ram));