REPL limitations? SD mount works on board but not via REPL



  • Are there limitations to what can be run via REPL vs actually uploaded to the device?

    I'm running Visual Studio Code with Pymakr 1.1.6 connecting to a LoPy4 (1.20.2.rc6) on a Pysense board via USB to my Win10 machine.

    I've got a fairly basic SD card script that fails on os.mount(sd, '/sd') when run through REPL, but it works when uploaded to the board.

    I normally click the "> Run" button on the VSC taskbar to "run the current file".

    Am I doing something wrong? Is there a better way? Any ideas of why this SD card isn't mounting via REPL (it's a 32GB level 4 card)?

    from machine import SD
    import os
    print('Start')
    gc.enable()
    sd = SD()
    print('Code point 1')
    os.mount(sd, '/sd')
    print('Code point 2')
    f = open('/sd/test.txt', 'a')
    f.write('Testing SD card write operations')
    f.write('\n')
    f.close()
    

    Error:

    >>>
    >>>
    Start
    Code point 1
    Traceback (most recent call last):
      File "<stdin>", line 8, in <module>
    OSError: [Errno 1] EPERM
    >
    


  • Great that it worked out. For anyone seeing this thread, but not finding what they need in the pycom documentation, there are also the possibility to delete items on the sd card using the command:

    uos.remove(path)
    

    path could be something like:

    '/sd/log.txt'
    


  • @jcaron @railmonitor I've done some more research, and because I didn't find this info anywhere else, here's what I found (please correct me if you see anything wrong).

    If you run os.mount(sd, '/sd') when it is already mounted you get this error: OSError: [Errno 1] EPERM

    When there is no SD card physically in the slot, the mount doesn't throw an error, but when you try and open a file
    f = open('/sd/file.txt', 'a') you'll get error: OSError: [Errno 19] ENODEV

    Trying to unmount: using the command specified in the pycom docs:
    https://docs.pycom.io/firmwareapi/micropython/uos/#uos-mount-block-device-mount-point-readonly-false uos.unmount(sd) or uos.unmount('/sd') or even uos.unmount() the error is AttributeError: 'module' object has no attribute 'unmount'

    Obviously this is because unmount isn't right, but the micropython docs set me straight - it should be umount, then umount('/sd') works as expected. I will submit a pull request on the pycom docs now to fix them.

    If you try and umount when there's nothing mounted you'll get this error: OSError: [Errno 22] EINVAL

    So, a try/catch around the mount to see if it's already mounted, a try/catch around the file open to see if there's an SD card, and a try/catch around any unmounts just in case there's nothing mounted there will catch all of these scenarios.

    Heaps of extra info on this reply I know, hopefully it helps with anyone in the future searching.



  • @mk what error are you getting? Do you have any open files on that fs?



  • @mk I would guess the same path as when mounting.

    uos.unmount(sd, '/sd')
    


  • @jcaron great point! You are correct, have just wrapped the mount in a try catch and then moved on to the the file write either way and it works fine. I didn't think to do that!

    It did occur to me the other day that it might need unmounting first, but the unmount was failing too - the unmount docs are a bit vague, so I think I was doing it wrong...

    from: pycom uos docs

    uos.mount(block_device, mount_point, * , readonly=False)
    Mounts a block device (like an SD object) in the specified mount point. Example:
    
    os.mount(sd, '/sd')
    uos.unmount(path)
    
    Unmounts a previously mounted block device from the given path.
    

    I tried:

    uos.unmount(sd)
    uos.unmount('/sd')
    

    and they both failed with errors. Do you know what path should be?



  • @mk Is the SD card not already mounted?


Log in to reply
 

Pycom on Twitter