Hacker Newsnew | past | comments | ask | show | jobs | submit | andy_threos_io's commentslogin

  Location: EU / Hungary
  Remote: Yes
  Willing to relocate: Mostly no, but open if absolutely necessary
  Technologies: Embedded systems, OS development, C/C++, Assembly, Python, Java, Lua, JavaScript, TypeScript, React
  Résumé/CV: Available on request
  Email: andy@threos.io
Hi HN,

We’re a small team of experienced developers based in the EU, looking for new contract opportunities. We're at a transition point and open to engaging with new projects, especially those that value deep technical expertise and long-term reliability.

We’ve worked across various hardware/software domains, including embedded systems, custom operating systems, and networked IoT platforms. Some highlights of our work:

  next comment
Core Team:

    Me – Product manager, embedded senior dev, hardware design reviewer, Threos OS architect, C/C++/asm/Python/JS and others, some Django, 3D design

    Teammate 1 – Software developer/designer (C/C++ and others)

    Teammate 2 – Software developer/designer (C/C++, JavaScript, TypeScript and others)
We also work with a wider circle of trusted collaborators: industrial designers, hardware engineers, generalist devs, and subcontractors as needed.

We love working on challenging technical projects—especially those involving embedded systems, custom hardware, or low-level software. We're not afraid to roll our own solutions when needed, whether that's a communication protocol, a lightweight virtual machine, or a custom scheduler. If you think we might be a good fit for your team or project, feel free to reach out at andy@threos.io. We'd love to hear from you.


    2010–2024: Wireless voting system for a bank’s annual shareholder meetings.

        ARM-based handheld terminals with 2.4GHz RF and LDPC error correction

        Custom embedded OS, base stations, and 3D-printed enclosures

        Deployed and used continuously for 14 years

    2006–2014: Distributed IoT platform (prototype)

        Embedded VM and bytecode execution on custom hardware

        Desktop CAD-style app for dataflow programming

        Fully working prototype demonstrated at trade shows

    2014–2017: Hardware/software unit for tax inspection system

        Project delivered; final deployment halted due to partner backing out

    2015–Present: Threos OS (https://threos.io)

        Object-oriented, modular real-time operating system

        Single virtual address space with memory protection, multitasking

        POSIX subset, package manager, dynamic linking and relocation

        Dynamically linked libraries

        Ported applications: GCC, Python, nano, etc.

        Functional on x86_64 hardware

    2017–2021+: Remote network monitoring system for a telecom company

        1U embedded Linux device with modular IO, deployed and in daily use

        Web-based configuration UI

        Modules: LTE, environmental sensors, backup battery

    2020–2025: Wireless IoT system for utility monitoring

        Proprietary RF protocol over 433MHz LoRa

        Battery-backed modules for impulse counting, DSMR, environmental monitoring

        Gateway with LTE, Wi-Fi, and LoRa, managed via web UI

        Fully functional prototype state


With a better coding you don't need more than 8 bits for a move (less for some).

The implementation should store a state machine for the game, a struct for each pieces, and also the board with index to the pieces (occupation).

There is only 16 pieces for each player, the two players move one another.

The Naive would be that you index the pieces (4 bits) and store the movement after that,

Pawns 2 bits for movement (2 forward, 2 diagonal)

King 4 bits for movement (normal move 1 + 3 bits, castle 1 + 1 bits)

Knight 3 bits for movement (8 possible move)

Rook 4 bits for movement ( 1 bit orientation horizontal/vertical 3 bit new position )

Bishop 4 bits for movement ( 1 bit orientation left/right diagonal 3 bit new position)

Queen 5 bits for movement ( 2 bit orientation horizontal/vertical/ left/right diagonal 3 bits for new position)

This way you need

Pawn 4 (index) + 2 (movement) = 6 bits

King 4 (index) + 4 (movement) = 8 bits

Knight 4 (index) + 3 (movement) = 7 bits

Rook, Bishop 4 (index) + 4 (movement) = 8 bits

Queen 4 (index) + 5 (movement) = 9 bits

But you can encode the pieces index in another way, that the Queen got 3 bit index and other pieces got longer index (Pawn 5 bits)

index bits + movement 000 + 5 movement Queen -> 8 bits

00100 + 3 movement King Normal -> 8 bits

00101 + 1 movement King castle -> 6 bits

0011x + 3 movement Knight (2) -> 8 bits

01xxx + 2 movement Pawn (8) -> 7 bits

10x + 4 movement Bishop (2) -> 7 bits

11x + 4 movement Rook (2) -> 7 bits

Also other bit allocations are possible, I don't know if it's worth it to make the Pawns index 1 bit longer, but in this way the max 8 bits required for a movement. (You need the state machine for the "decompression", also have to track that the black and white Pawns are moving in the opposite direction. )

There can be further compression, if you check the possible move for the piece. ex. the first possible Knight movement is only 1 place, so no need to store the movement. But this need more calculation.


My view that, this code is nice, however IMO there are several ways to make it more portable, and programer friendly, specially the ported assembly code part.

Example.

In file threadx-master/ports/cortex_a7/gnu/src/tx_thread_schedule.S

in this code

    /* Increment the run count for this thread.  */

    LDR     r2, [r0, #4]                    // Pickup run counter
    LDR     r3, [r0, #24]                   // Pickup time-slice for this thread
    ADD     r2, r2, #1                      // Increment thread run-counter
    STR     r2, [r0, #4]                    // Store the new run counter
the indexes to the data structures are really hard to modify, so you can't make modifications to the structures easy, the C structures and the assembly code indexes must be in sync, or the system will crash. And there are literally 100s of files with assembly indexes in the code.

But it can be made it easier, with another layer and macro preprocessing. So make a header one for the assembly and one for the C code, and define the struct with the macro. The assembly code can be compiled with C preprocessor, so the macros will work.

This way the C and the ASM stay sync. Only drawback, that the struct must be defined with this macros. But this is only for the structures that are used both in assembly and C or higher level.

Anyway if the indexes in the assembly code would be macros, that would be also much easier to modify.


Real world manufacturing machines (CNCs) are using G codes. Like most laser cutters and engraves, Ex. LaserGrbl software for laser machines.

G codes in fact have command for arcs.

G02 establishes a mode for clockwise circular arcs. G03 establishes a mode for counter-clockwise circular arcs.


I think the OP's concern was that they couldn't upload G-Code, they could only upload PDFs. And because PDFs don't encode circles, a mechanistic translation to G-Code can't convert it into a G-Code circle, only a curve that emulates a circle.

So... you know... note to self... when designing a laser cutter, allow the user to upload G-Code.


This is true for almost every machine tool I've ever used (CNC mills, 3d printers, CNC plasma cutting, & water jet), but every laser cutter I've ever used (and I've used the kind that runs on 3-phase power and has no safety enclosure) speaks some variant of PCL. The one exception being a $300 home-brew tabletop laser running the aforementioned LaserGrbl...

That said, apart from a handful of misconfigurations, I've never had a problem getting any of them to cut out nice circles.


win10 is slower on some aspect than win7. (not the bootup, but normal operation)


Win 10 is slower because just like Android, it phones home. And the "compositor" is compositing. But that is what you get when you have to change the whole screen surface ( terminal screen) because the cursor ( one character) blinked.


+1000


I found this [1] from MS very useful when I designed some PCB inductor coil for a project. It was only 2D, but some 100 lines of code made the development so much easier.

[1] https://maker.js.org/


Just a not so recent news from the rust compiler:

https://blog.rust-lang.org/2021/05/10/Rust-1.52.1.html

"The Rust team has prepared a new release, 1.52.1, working around a bug in incremental compilation which was made into a compiler error in 1.52.0. We recommend all Rust users, including those currently using stable versions prior to 1.52.0, upgrade to 1.52.1 or disable incremental compilation. Guidance on how to do so is available below."

Is this mature enough to be bring in the kernel ????


Nowadays, it's better to use x86_64 only. The 32 bit x86 has many drawbacks. The 64 bit is much cleaner and better in many many ways.

  -no segmentation, flat address space
  -better interrupt handling
  -better system call
  -more registers
  etc.
Also we found that Qemu or other Virtualization technology may cover up some of the hardware issues. Eg. Beside, that every hardware device (keyboard, usb, display, disk etc.) will have some simplified behavior, if you emulate an ARM cpu on x86_64 host, than the cache coherency will totally messed up on real hardware.


Yes, absolutely correct about possible QEMU simplifications. One option would be to use gem5 which can simulate caches/memory more accurately (sometimes), but it is also way slower as a result, some indications at: https://github.com/cirosantilli/linux-kernel-module-cheat/tr...


I know a good number of people who will move away from Linux after Rust get in the kernel.


As someone who worked on kernel/OS code in C for many years, I'm very happy to see any language that doesn't sacrifice it's fit for embedded systems try to enter this space.

I think it was a shame that go didn't prioritize the lower-level use cases like its ancestors and I think not falling into a NIH syndrome is wise and mature of Google.

People will drop out because of change, and others will join or comeback. Life goes on.


What are those people's objection to Rust in the kernel? Do they prefer C's way of controlling and managing memory allocation?


Rust is an absolute no brainer in my eyes after writing it almost exclusively for embedded platforms for the past 8 months.. But sure, it’s not fit for all legacy systems with parts of Linux probably included in that list


Why ? Are they Users, kernel developers ? Move to what


time to fork it, pull out rust, and get that one active. that's what foss is all about.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: