I’m trying - and so far failing - to do what should surely be a very simple thing. This isn’t a new situation…
especially on unix. I have a single C file with just two functions. I have a matching H file. I want to make them into a dynamic library that I can call via FFI. This really shouldn’t be rocket science stuff! So far I can a) compile the C file (well duh) b) link it as a shared library c) install it in /usr/local/lib (next to another library that I can use from FFI already, so I know the path gets looked at) d) set the permissions to match the working library e) use from a simple C program to prove it works However, all I get from squeak is an error that the external module is not found. I’ll take a look with a debug vm but I’d be very happy to hear that I’m forgetting some trivial flag or incantation that can short-circuit the ‘fun’ of using gdb. Here is the code and makefile - https://copy.com/DGDbpJM4wnHQrDUG What I’ve been doing to build & try is make clean make sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1 sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so sudo ldconfig gcc -Wall -o testing testing.c -lmadwickIMU ./testing ‘testing’ seem to do the right thing. Going into squeak (cog/spur/pi) and trying a method like - invSqrt: floatval #<cdecl: float ‘invSqrt’ (float) module: ‘madgwickIMU’> ^self externalCallFailed - just gives me the not found module error. I’ve restarted squeak after building the lib, I’ve opened a new terminal after building the lib (just in case there’s some stupid path-exporting nonsense I don’t understand etc) and I’ve made sure to smile only on the left side. What on earth am I forgetting? tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim Useful Latin Phrases:- Braccae illae virides cum subucula rosea et tunica Caledonia-quam elenganter concinnatur! = Those green pants go so well with that pink shirt and the plaid jacket! |
Hmm. Maybe try creating the class method: moduleName ^'madgwickIMU' (assuming you haven't already). -cbc On Wed, Sep 9, 2015 at 11:17 AM, tim Rowledge <[hidden email]> wrote: I’m trying - and so far failing - to do what should surely be a very simple thing. This isn’t a new situation… |
On 09-09-2015, at 11:33 AM, Chris Cunningham <[hidden email]> wrote: > Hmm. Maybe try creating the class method: > > moduleName > ^'madgwickIMU' > > (assuming you haven't already). Ah, but that would be for a plugin, whereas this is a simple C library. Or *should* be, if I got it right. tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim Strange OpCodes: XER: Exclusive ERror |
On Wed, Sep 9, 2015 at 11:40 AM, tim Rowledge <[hidden email]> wrote:
ok. Does FFI know to prepend the lib and postpend the .so in Unix for you? I'm curious. -cbc
|
On 09-09-2015, at 11:44 AM, Chris Cunningham <[hidden email]> wrote: > ok. Does FFI know to prepend the lib and postpend the .so in Unix for you? I'm curious. Well, it does for other libraries; for example calling libwiringPi.so you use #<cdecl: void ‘foo’ (int) module: ‘wiringPi’> tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim Strange OpCodes: SNARF: System Normalize And Reset Flags |
How do you start squeak ? Is there a squeak shell script that may modify the library lookup path?2015-09-09 20:55 GMT+02:00 tim Rowledge <[hidden email]>:
|
On 09-09-2015, at 12:26 PM, Nicolai Hess <[hidden email]> wrote: > How do you start squeak ? > Is there a squeak shell script that may modify the library lookup path? > > you could try to start squeak with > LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH squeak OK, tried that to no avail; but the wiringPi library in the same directory works :-) What fun, eh? ldconfig -p | grep mad shows ‘libmadgwickIMU.so (libc6,hard-float) => /usr/local/lib.libmadgwickIMU.so Into the joys of gdb right now, just starting to (attempt to) load the lib. I wonder if it’ll be friendly? tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim In the long run, every program becomes rococco, and then rubble. |
In reply to this post by timrowledge
I think you may have typed "W" one to many times in this Makefile and you're adding them where they don't belong. I detect a rogue W in the name madgwick. Also, when I compile on this Ubuntu 15.04 I get an error. [1] FWIW, Chris [1] $ make [Compile] MadgwickAHRS.c MadgwickAHRS.c: In function ‘invSqrt’: MadgwickAHRS.c:218:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] long i = *(long*)&y; ^ MadgwickAHRS.c:220:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] y = *(float*)&i; ^ [Link (Dynamic)] On Wed, Sep 9, 2015 at 2:55 PM, tim Rowledge <[hidden email]> wrote:
|
On 09-09-2015, at 12:55 PM, Chris Cunnington <[hidden email]> wrote: > I think you may have typed "W" one to many times in this Makefile and you're adding them where they don't belong. I detect a rogue W in the name madgwick. Ah, just for a moment there I thought you’d spotted the dumb mistake. But I was ‘correcting’ that in the install stuff and fixing the makefile etc resulted in exactly the same result. Sigh. tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim It is easier to change the specification to fit the program than vice versa. |
In reply to this post by timrowledge
>
> On Sep 9, 2015, at 12:17, tim Rowledge <[hidden email]> wrote: > > sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1 > sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so ^ Is there a reason for the madwick instead of madgwick? Ken > On Sep 9, 2015, at 12:17, tim Rowledge <[hidden email]> wrote: > > I’m trying - and so far failing - to do what should surely be a very simple thing. This isn’t a new situation… > especially on unix. > > I have a single C file with just two functions. I have a matching H file. I want to make them into a dynamic library that I can call via FFI. This really shouldn’t be rocket science stuff! > > So far I can > a) compile the C file (well duh) > b) link it as a shared library > c) install it in /usr/local/lib (next to another library that I can use from FFI already, so I know the path gets looked at) > d) set the permissions to match the working library > e) use from a simple C program to prove it works > > However, all I get from squeak is an error that the external module is not found. I’ll take a look with a debug vm but I’d be very happy to hear that I’m forgetting some trivial flag or incantation that can short-circuit the ‘fun’ of using gdb. > > Here is the code and makefile - > https://copy.com/DGDbpJM4wnHQrDUG > > What I’ve been doing to build & try is > make clean > make > sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1 > sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so > sudo ldconfig > gcc -Wall -o testing testing.c -lmadwickIMU > ./testing > > ‘testing’ seem to do the right thing. Going into squeak (cog/spur/pi) and trying a method like - > invSqrt: floatval > #<cdecl: float ‘invSqrt’ (float) module: ‘madgwickIMU’> > ^self externalCallFailed > - just gives me the not found module error. > > I’ve restarted squeak after building the lib, I’ve opened a new terminal after building the lib (just in case there’s some stupid path-exporting nonsense I don’t understand etc) and I’ve made sure to smile only on the left side. What on earth am I forgetting? > > tim > -- > tim Rowledge; [hidden email]; http://www.rowledge.org/tim > Useful Latin Phrases:- Braccae illae virides cum subucula rosea et tunica Caledonia-quam elenganter concinnatur! = Those green pants go so well with that pink shirt and the plaid jacket! > > > |
On 09-09-2015, at 2:07 PM, Ken G. Brown <[hidden email]> wrote: >> >> On Sep 9, 2015, at 12:17, tim Rowledge <[hidden email]> wrote: >> >> sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1 >> sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so > ^ > Is there a reason for the madwick instead of madgwick? Sigh; yes, a stupid typo when writing the email. Not in the ‘actual’ commandline. Now I’m running dbg through loading te wiringpi library that it *does* find ok, to see where it thinks it finds it. This is getting really a bit daft. tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim The substance "Hey Y'all, watch this!" is known by the state of California to be hazardous to your health. |
So after too much annoyance I finally found the stupid problem. It’s an object lesson in ‘stupid things OSs do to people’.
I’m sure somebody somewhere thought it was a good idea to scatter libraries around the place and then make it possible for applications to not know about all of them. The result is that you end up with shell scripts that try to work out what the library paths are and set environment variables and/or pass arguments along, often to yet another script. Eventually you get to some code in the application that has to look up something involving all this cruft and just have to hope it was all done reasonably well. And of course, no two *nix versions actually agree on what the paths should be. What a concept! Thus my situation today; a library lives in /usr/local/lib and I naively make another library and sit it next to that. After all, the first library works ok, right? No problem. But the damn scripts don’t actually do anything with this path, as I discovered after a tedious pair of debugging runs when the *working* library didn’t work. I happened upon looking at all the places where the module loading code seemed to peek. And lo! A link from one such place to the %$^ing /usr/local/lib/libwiringPi.so file. Sigh. Make a link for my new library and it actually loads. Mind you, it returns a Character instead of a Float, so something else is happening now. I still can’t work out how that link got there. I still can’t work out how the ldconfig cache-thingy doesn’t let the library load. I still can’t work out why RISC OS isn’t the normal OS. Thanks for the assorted suggestions! tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim Useful random insult:- Ready to check in at the HaHa Hilton. |
In reply to this post by timrowledge
On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
> I?m trying - and so far failing - to do what should surely be a very simple > thing. This isn?t a new situation? especially on unix. > > I have a single C file with just two functions. I have a matching H file. > I want to make them into a dynamic library that I can call via FFI. This > really shouldn?t be rocket science stuff! <OT> I assume there is some good reason that you would not do an end run around all that rocket science and just write a plugin? After all, you are the person who wrote the excellent early papers on how to extend the VM with plugins, and most of what little I know of VMs came from reading your early work on the topic. I would hate to be the one to deny a masochist his private pleasures, but really, why not not just do it the easy way? </OT> Dave |
http://sdmeta.gforge.inria.fr/FreeBooks/CollectiveNBlueBook/greenberg.pdf
Write it in Smalltalk: #reverseInPlaceFrom:to: | temp | 0 to: to - from // 2 do: [:index | temp ← self at: from + index. self at: from + index put: (self at: to-index). self at: to-index put: temp] Re-write it as Slang: #primReverseFromto self export: true. self var: #rcvr declareC: 'int *rcvr'. to ← interpreterProxy stackIntegerValue: 0. from ← interpreterProxy stackIntegerValue: 1. rcvrOop ← interpreterProxy stackObjectValue: 2. rcvr ← self cCoerce: (interpreterProxy firstIndexableField: rcvrOop) to: 'int *'. interpreterProxy success: (from >= 1 and: [from+1 <= to]). interpreterProxy success: (to <= (interpreterProxy stSizeOf: rcvrOop)). interpreterProxy failed ifTrue: [^nil]. rcvr ← rcvr - 1. "adjust for 1-based indexing." 0 to: to-from/2 do: [:index | t ← rcvr at: from + index. rcvr at: from + index put: (rcvr at: to-index). rcvr at: to-index put: t]. interpreterProxy pop: 3 thenPush: rcvrOop Or subclass the long lost TestCodeGenerator to do it for you! Chris For those of you watching at home, the article above has the HelloWorld of plugins. Igor changed is slightly for a lecture in 2011 to make a plugin called TheUniversalAnswer. It returns 42. #answerSeventeen self export: true. interpreterProxy pop: 1 thenPush: (interpreterProxy integerObjectOf: 17) All you need now is a compiling rig with two VMs and two images. The VM you start your VMMaker image with. The VM you compile from the VMMaker source you just generated. And the pristine target image you start with the VM you just compiled to prove it works. Your spiral into plugin compiling madness starts with this handy script: http://lists.squeakfoundation.org/pipermail/squeak-dev/2012-October/166038.html On 2015-09-09 9:53 PM, David T. Lewis
wrote:
On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:I?m trying - and so far failing - to do what should surely be a very simple thing. This isn?t a new situation? especially on unix. I have a single C file with just two functions. I have a matching H file. I want to make them into a dynamic library that I can call via FFI. This really shouldn?t be rocket science stuff!<OT> I assume there is some good reason that you would not do an end run around all that rocket science and just write a plugin? After all, you are the person who wrote the excellent early papers on how to extend the VM with plugins, and most of what little I know of VMs came from reading your early work on the topic. I would hate to be the one to deny a masochist his private pleasures, but really, why not not just do it the easy way? </OT> Dave |
In reply to this post by David T. Lewis
On 09-09-2015, at 6:53 PM, David T. Lewis <[hidden email]> wrote: > On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote: >> I?m trying - and so far failing - to do what should surely be a very simple >> thing. This isn?t a new situation? especially on unix. >> >> I have a single C file with just two functions. I have a matching H file. >> I want to make them into a dynamic library that I can call via FFI. This >> really shouldn?t be rocket science stuff! > > <OT> > I assume there is some good reason that you would not do an end run > around all that rocket science and just write a plugin? Well I *did* originally point out that there was probably a really stupid mistake in my process and that is pretty much it. In my defence I was in the midst of FFI-ing to multiple external libraries for assorted Pi add-on doohickeys and getting somewhat inured to the idea. But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn’t seem quite right. tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim Useful random insult:- Not enough sense to come in out of the rain. |
On Thu, Sep 10, 2015 at 10:29 AM, tim Rowledge <[hidden email]> wrote:
I'm sure this can be fixed. Have you talked to Doug McPherson? _,,,^..^,,,_ best, Eliot |
On 10-09-2015, at 12:33 PM, Eliot Miranda <[hidden email]> wrote: > But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn’t seem quite right. > > I'm sure this can be fixed. Have you talked to Doug McPherson? Yup. And after much head-scratching because I’ve completely forgotten how plugin building works, I finally have a plugin that takes 9 float values, does unspeakable things to them and spits out a four float quaternion answer. On a Pi2 it test at ~ 8 micro-sec per call, which isn’t bad for 270+ floating point operations including 150 divides. The next fun is feeding live IMU data to it and finding away to display something meaningful as a result. tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim Strange OpCodes: BOMB: Burn Out Memory Banks |
On Thu, Sep 10, 2015 at 06:55:55PM -0700, tim Rowledge wrote:
> > On 10-09-2015, at 12:33 PM, Eliot Miranda <[hidden email]> wrote: > > But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn?t seem quite right. > > > > I'm sure this can be fixed. Have you talked to Doug McPherson? > > Yup. > > And after much head-scratching because I?ve completely forgotten how plugin building works, I finally have a plugin that takes 9 float values, does unspeakable things to them and spits out a four float quaternion answer. On a Pi2 it test at ~ 8 micro-sec per call, which isn?t bad for 270+ floating point operations including 150 divides. The next fun is feeding live IMU data to it and finding away to display something meaningful as a result. > Can you send a copy of your plugin as a fileout, change set, or mcz? I am expecting that you have one primitive with 9 double precision Float objects as parameters that are coerced to single precision floats and passed as parameters to MadgwickAHRSupdate(), which deposits the results into the q0, q1, q2, and q3 variables, which are coerced back to double precision Float objects and pushed back to the image as the result. Is that right? Thanks, Dave |
In reply to this post by timrowledge
On Thu, Sep 10, 2015 at 10:29:24AM -0700, tim Rowledge wrote:
> > On 09-09-2015, at 6:53 PM, David T. Lewis <[hidden email]> wrote: > > > On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote: > >> I?m trying - and so far failing - to do what should surely be a very simple > >> thing. This isn?t a new situation? especially on unix. > >> > >> I have a single C file with just two functions. I have a matching H file. > >> I want to make them into a dynamic library that I can call via FFI. This > >> really shouldn?t be rocket science stuff! > > > > <OT> > > I assume there is some good reason that you would not do an end run > > around all that rocket science and just write a plugin? > > Well I *did* originally point out that there was probably a really stupid mistake in my process and that is pretty much it. In my defence I was in the midst of FFI-ing to multiple external libraries for assorted Pi add-on doohickeys and getting somewhat inured to the idea. > > But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn?t seem quite right. > I don't know what got into me, but I brewed up a nice pot of coffee this morning and ended up with http://squeaksource.com/MadgwickAHRS/ This is a plugin, accessor class, and unit tests that claim to demonstrate that the plugin works. I used FloatArray for parameter passing, on the theory that users of the plugin may be doing float (not double) arithmetic, so it may be more efficient to pass values in that manner. It works with 32/64 bit image and host, and the plugin builds without complaint (trunk with Ian's Cmake build) if you put the library source files MadgwickAHRS.c and MadgwickAHRS.h in platforms/Cross/plugins/MadgwickAHRS/ The MadgwickAHRS library is licensed GPL, so it would be best to link the plugin dynamically to e.g. /usr/local/iib/libwmadgwickIMU.so.1 rather than static link to the C code as I have done so far. If there is any interest in the plugin, I'll see if I can figure out the linker magic. See class MadgwickAHRSTest for examples. Repository is at http://www.squeaksource.com/MadgwickAHRS Tim, I added you as developer on the squeaksource.com repository in case you want to make use of this. Dave |
Cool. I'm going to try this out. Chris On Sep 12, 2015 7:47 PM, "David T. Lewis" <[hidden email]> wrote:
On Thu, Sep 10, 2015 at 10:29:24AM -0700, tim Rowledge wrote: |
Free forum by Nabble | Edit this page |