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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ Z" h8 X6 l3 S) n" u0 q

) k9 m" N8 Q" ]0 S. OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ d1 ^  l; @: u#include <unistd.h>
: a( \; \+ Z* T. o& w3 ]#include <sys/mman.h>
1 S" k9 T1 @: z% j  `3 R. @#include <sys/types.h>, M- Q; ^# e9 G4 a
#include <fcntl.h>* W* c/ s* M( ~* l9 ?
. v* h+ h+ O4 Y; }: b/ p
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # F! i2 s2 l# Q* h: f

/ j. e/ P- ~$ B8 V/ Y; G+ r6 Qtypedef struct- l, T5 v% p- A5 D" x- S, G- a1 a% h
{
. S' X  g  ~; f4 M" ^        unsigned int a;. h  c+ F/ {' j" x" W4 H0 B
        unsigned int b;. Z; q( e' y8 E5 s" h" R
        unsigned int packet_cout;
* T; D( [/ ]' t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 n# a1 f# H+ b1 _# l
- e5 o1 W8 H* q4 a3 x5 |' @9 x$ Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 Z& j; k, o) t( {  r' K. J. [6 J0 Y
unsigned int count_copy = 0;
) I4 O  a8 A, Q0 R
" z- m( e* c; M- d. y+ ?( P4 U4 B7 @% f# p; x; e% P
int main()5 r& V" x" e0 F% a$ K
{
# {7 G7 W' U3 n0 u" p        pRX_MSG_PROTOCOL pshreRAM = NULL;; j- i' H  b, K6 x3 _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 o+ u( f  s3 b( i/ G8 I& Q# ]7 Y( W. S

6 U2 q  g! F  ^1 K) l$ f$ P8 t# }        while(1)/ D  H! [$ u! g6 [' L0 n
        {
3 W3 F; ~6 W6 M: K/ |6 x                read_MSG_buffer(pshreRAM);
  N9 v( E) [, D9 i; b# X0 Z        }                : Y% Q3 j$ {# t# m8 O
}& C7 L7 f% d9 H! A

; _; D7 q9 o% ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; Z3 w; X: c" M* N/ F{
; f- N" F  g8 x1 H0 h/ i        RX_MSG_PROTOCOL buf;
  H& t' o7 M) _6 V" h        5 _; l( ^# l6 ?/ E
        buf.a = pshreRAM->a;3 g% Q# m( O! w5 ]. X9 d+ j5 G
        buf.b = pshreRAM->b;
! ~6 t1 ?" {/ z9 c+ L9 m8 S  v6 A        buf.packet_cout = pshreRAM->packet_cout;
0 L4 A1 y1 m9 t" }, Y$ |, [        
# H2 K, D- H1 P        if(buf.packet_cout != count_copy)
! l# E+ F! \7 b4 Q1 c# l7 @        {; l8 F' E  M% O. W6 E) g
                printf("a is %d\n", buf.a);' I" }$ O8 m1 b+ d3 h8 }3 ~1 q
                printf("b is %d\n", buf.b);
7 w2 B% z( S2 y! Q                printf("count is %d\n", buf.packet_cout);
+ j2 ]- W: Q" ?& X7 j                count_copy = buf.packet_cout;3 T; s6 M- P; D3 U
        }; n. D0 T( O, t0 W' b$ z, Z
        else
7 i& ?- U$ A( `! D5 x        {* x0 N+ w/ u. y  V* s
                printf("No effective message!");
. g! S. }/ P+ f4 X1 s: ?. {        }
( g  E4 x9 h+ ~- V) e1 T8 f- N}: ~3 A. F" ~6 z4 Y* j

5 B8 x+ K9 p. A* g& m. X+ r7 O# q4 d$ Y8 ^2 y- J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 e' @- I5 V& @2 L0 F. i. _使用下面代码,对内存使用了mmap函数后:
9 ^+ W- U7 j6 ?( I; V- Z#include <stdio.h>$ j& v/ b& U$ X3 c" @5 c' D
#include <unistd.h>
/ @% Y6 w2 q2 Y#include <sys/mman.h>
( o6 O/ ~; k( h+ T9 ]+ e$ w#include <sys/types.h>- \! M! Q# F! T
#include <fcntl.h>5 a# {  \, n$ C* N

$ K: K+ o4 W  }* u#define SHAER_RAM_BASE_ADDR    (0x80000000)# Z% ?% B& _$ {( @& Z9 E7 A$ E
#define SHAER_RAM_SIZE         (0x20000)   7 U5 r6 q& K( X3 C
# W/ g. h- ~8 E- y/ U; T0 l
typedef struct
! q* n+ ^  Y: A) T) Q  N  ^! c( |{* ]: }! s# m! x) b  v
        unsigned int a;
7 a3 E: t0 P9 D8 t        unsigned int b;
4 X, }. P1 y" I% ^6 W& v        unsigned int packet_cout;
# x0 M  d' p1 N% i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& Y, q2 A. ]) P' z1 \
( k% b7 @% s1 Vvoid read_MSG_buffer(int *baseaddr);7 ?1 k$ s( F& A- D, ]5 I
unsigned int count_copy = 0;
9 _; w' g2 O0 c# [; l
- Q* p% B2 s6 }" ^# B! Cint main()
4 j# i: A: J- \0 P% c9 v& h* a8 }{. g0 f" p. {8 U  Q7 J
        int fd;( Y" s1 V% N$ k: }
        int *mem = NULL;
4 [" X, ^  k1 s. V! G2 \
+ r( U2 d. ~! h% L1 O) @$ E        if((fd = open("/dev/mem", O_RDWR)) <0)
- c  ~5 t( H( }6 F% Z5 P$ ~        {/ K. z, u5 o+ f6 |% g
                perror("open error");+ I  X" h# B! F! X  _
                return -1;! ^( M+ g6 s$ w5 Z; T
        }. p2 H) I7 m+ N6 u+ |2 P
        ; Y5 x7 W; B; h7 f$ F9 T
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 K! e2 n( e* e, D) X# k# I+ _
/ t3 |7 p/ J3 ?7 W( i' L( p8 j        while(1)
; z# T+ l# ?. J& `& z        {6 {; v, Q9 s) ^8 }$ Y3 o0 `
                read_MSG_buffer(mem);) d9 K/ t5 S0 J+ }
        }                ( F" U7 I& B' [  c5 J" l! |4 v0 Q
}
; X- E' V  p3 R
+ [0 m* L$ `4 i6 `+ W* ]void read_MSG_buffer(int *baseaddr)
) M4 |& s7 C) S{
+ i. }% n& _6 B- O        pRX_MSG_PROTOCOL pshreRAM = NULL;; r! ]+ i2 R. M+ f9 p

* [% Z. O  a) C1 }# I1 [% U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 f- r0 X3 m6 Q# n" i" s, C3 x
  D5 h  s1 E) k- i$ x; L0 `  `
        if(pshreRAM->packet_cout != count_copy)
% r, n/ k- N! ]5 [        {3 h' U6 T+ k  p- L; t0 D/ r
                printf("a is %d\n", pshreRAM->a);
! q; c! F6 R& a5 H* I! o                printf("b is %d\n", pshreRAM->b);
4 H* B- F2 x" I" W# R/ W% m                printf("count is %d\n", pshreRAM->packet_cout);
& P, r5 }5 [) d6 C' b4 ^                count_copy = pshreRAM->packet_cout;
0 Q  V9 U6 c( z1 ]( T        }
0 S: y* m  S) O9 [        else
+ ~3 u* \$ a( D2 ?8 }' P- C        {
$ a) ~& T" r8 ?4 O  r2 y5 ]2 h                printf("No effective message!\n");2 g8 s8 a6 t5 c. t/ X( D1 b7 [; ?
        }! R2 s; @5 l2 J! a9 Y
}& G5 R% I, h* Y0 y  b4 k: A

7 B' r* E) Y( }$ ]4 g& q9 ~- g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) H7 N! o2 ?5 S1 J3 o. h- Y' s2 A- B3 K, B" a; l8 x+ f9 d1 K
2 @" J* i6 `; ]/ G" ]& n

, t. u. d; D, y; p" S$ s/ ?* @2 w  L- k5 z+ x4 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 20:32 , Processed in 0.049933 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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