OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5740|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: @  \8 d; s) l' ^: ?, ?+ i
* V3 h) X- ~! m$ R' H/ IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- T- }* q( ^1 l# v+ h% E
#include <unistd.h>
1 \8 n+ F( A# o% h# G3 P" L6 a#include <sys/mman.h>
8 n- l/ ?; V  z+ _% X# k0 @7 W( o; g#include <sys/types.h>
4 ~5 O! [" T0 g! C# i5 h, l% Y#include <fcntl.h>0 R) w6 O7 c, q2 A) \! u  q" J+ v

1 B; j- t) t& g/ [# `* N#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, ?% ?. f! x" i0 t2 n- Z4 b; c; \  s& l3 c
typedef struct) X6 [$ I8 {2 j) O2 ~% L
{  |3 ^" |( I+ K  A- ?7 t3 w
        unsigned int a;
# B; w1 v, E% R/ c4 p7 |3 N        unsigned int b;
: |5 @% x- B8 a: f" Q) Q        unsigned int packet_cout;
& @. C" Y0 e' e( E) C5 h0 \# h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 r, x1 A: ]) p# I

( V! r3 I$ Y- m: v+ dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) N. }8 T, ~# w2 \
unsigned int count_copy = 0;- x! N8 y; m& N1 f! J" M6 x/ b
. o; P% N$ K% x' p

4 w+ r* f! s3 c! c% i: P2 Pint main()9 a) I9 l3 n. L! t; x* u3 K  R
{
, M+ @" }* g6 q9 P9 t+ a" g4 c        pRX_MSG_PROTOCOL pshreRAM = NULL;/ e4 W. `* h6 j
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Z. b0 ~, f8 |4 x; z
' Q) D- G+ n: X0 j        while(1): O2 r) |8 J. ?( q
        {- Q7 h5 K7 P/ G- P5 _2 c
                read_MSG_buffer(pshreRAM);- [2 b3 w  c  |7 X9 z: [
        }                ) N' ~) ^( f8 h4 H# c
}7 O6 A7 Q" @1 S
5 f0 O& e( _+ x2 g$ I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! A4 X; y$ X1 c, z4 K4 W{
/ W/ g! i+ ?" h0 W: T2 {: f        RX_MSG_PROTOCOL buf;
/ q  L9 ~- @3 l/ m7 j        ) N# H' b- G8 F  K4 g! |2 L
        buf.a = pshreRAM->a;
8 R/ j7 Y0 O2 i$ \+ g5 S        buf.b = pshreRAM->b;2 ?* g" x, Q- q( D  a* O. ^
        buf.packet_cout = pshreRAM->packet_cout;
+ U: I; m' c6 v" |: s/ q; j5 |6 H        6 R, q- o5 g+ i! }" F* G9 @
        if(buf.packet_cout != count_copy)$ b% R$ e' t+ z3 Q. P
        {
$ Z; F' w* F  S5 Y0 F$ N                printf("a is %d\n", buf.a);9 `; [9 N/ N, x7 _
                printf("b is %d\n", buf.b);$ ^( x. T! S7 O
                printf("count is %d\n", buf.packet_cout);
. J7 U8 V* o0 ~& P2 C& @                count_copy = buf.packet_cout;
+ ^+ R7 y4 _! d( E  r4 J5 I% i4 t" l        }- k" o+ {1 j0 \) W" z
        else
8 T$ y- y" o2 e, |7 ?        {) ^5 A1 q: K+ m" s0 w" G
                printf("No effective message!");2 @% w3 R1 r" p0 C; V
        }
- N7 X" F2 p$ M8 Z- c}
: H! ?! M: D3 p
. m  F2 \, a, y; y% Y5 c; I' c& v$ R, `- |/ y- [/ q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. B1 C. g& u3 `: i) X2 c6 L
使用下面代码,对内存使用了mmap函数后:# ]5 O8 R0 y5 H8 x  M% Q* w5 |
#include <stdio.h>
) h( E' L  ^) t1 S- `#include <unistd.h>
6 C0 U/ E; }* L; h#include <sys/mman.h>
: }( v; C0 f& S4 i2 h& r" b#include <sys/types.h>- |# f' n- K. {) |* w: {& z& d2 f
#include <fcntl.h>- F  A2 j! i2 E" A% X/ t, a
, m, g! b: C( {+ h& Y4 J
#define SHAER_RAM_BASE_ADDR    (0x80000000)% i4 D3 j' U- L- I1 i! J  v
#define SHAER_RAM_SIZE         (0x20000)   # \" K. S0 t( d6 y/ d1 H. g
+ D. R. d) D; a5 d9 M6 ]) b
typedef struct
& A6 W6 I% X6 n3 J4 h" z{
6 q. Q2 `( f# s. u        unsigned int a;: ~* G; t1 {& `
        unsigned int b;$ D+ e) {: {& X' X7 Z& [
        unsigned int packet_cout;
3 p8 ~9 x& F  V  k+ e3 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ r1 s* \" O5 N

7 u6 N2 q. F# X! d( {& `4 _void read_MSG_buffer(int *baseaddr);7 D4 X" o/ {$ o  S" ~9 \1 z( F5 h
unsigned int count_copy = 0;
6 ?/ ~& [: j7 F
( i8 \$ A9 J( j$ {9 B* Uint main()) Y# i4 Y  Q  ]
{2 f$ R0 f4 _) j8 _$ F0 J
        int fd;
& P/ W3 H$ C2 W+ M2 Q! \        int *mem = NULL;
' @, [8 e# N7 n" z( O5 J. q
+ T) ?8 T, k8 _        if((fd = open("/dev/mem", O_RDWR)) <0)7 B' _: ~$ w0 {( ^! i1 z
        {
5 p8 n, d3 r8 @7 j7 Y6 o                perror("open error");  ?9 y+ j! k8 _8 P0 B6 [
                return -1;" |, k, N. n3 P/ K
        }/ K$ N$ O" b6 M: B9 ^) ?
        
' C# U( J6 H* K# |1 [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ \: `. ^2 z& ^9 Z8 ]* ~# M$ \5 ~+ [7 u$ k
        while(1)
+ r: u+ x$ H( |& i        {- q& q( Q9 H1 f, f* E7 ]
                read_MSG_buffer(mem);
: h- a; g# L" ~4 u$ Y' f1 a" q# a7 u        }                7 `6 T* e# ~, P
}' t1 I- L, i0 b% G; Q9 {

5 f& _' m9 Y9 G- R- l  rvoid read_MSG_buffer(int *baseaddr)
; @( v1 p, b0 v{( l: \! O  _7 Y- S
        pRX_MSG_PROTOCOL pshreRAM = NULL;. F3 I  p* w$ f3 N9 ?. T# e

8 X* B8 X4 z5 s. o  c        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 O" t9 o8 F9 c3 W5 ^/ `

- B/ q1 S- x! i& v- g+ L( a4 ?        if(pshreRAM->packet_cout != count_copy)& v# H' h6 o. d! G6 |
        {
  j3 @0 ~2 a% v: N                printf("a is %d\n", pshreRAM->a);+ N8 E! v- o6 n1 L
                printf("b is %d\n", pshreRAM->b);, i. T) C9 J# s
                printf("count is %d\n", pshreRAM->packet_cout);
+ n# `, {% |5 m6 v7 M1 Y% e' e5 v                count_copy = pshreRAM->packet_cout;
5 d: K4 ^  _& ?+ j" ~        }7 l) r- _* @+ M! a  P
        else
7 H( L; n4 `8 }        {
/ A) O" M6 s$ h! A1 \                printf("No effective message!\n");- w: W! Q$ m; `/ i" f+ J0 w  U+ ]
        }. w; S$ R" c+ H( Q; \, U  S
}
8 X, V0 i' ^. b' D) S3 l8 v% X! N$ _' n8 \; f$ P8 V, E3 m) d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& U( m1 X6 `" }$ M1 I
( i" }0 |: N# ~7 O2 [$ @

1 r7 A6 b1 H( b; f4 I4 V
- U8 {+ }: x3 j% a3 U6 [
$ i' v; {' a% p, r) w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-17 02:01 , Processed in 0.088959 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表