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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : p7 c4 j+ H+ l( t6 e; b8 k
+ u4 S4 s* P2 F) D+ T4 K# U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! b( m& K2 s6 C9 B% x2 h* M% b2 D
#include <unistd.h>: v2 U2 U' C, c4 t' \! |4 D6 d7 P- a
#include <sys/mman.h>6 r% ?9 j* P  A. m* v' R- H
#include <sys/types.h>6 r, o: y- q8 T, ]. S% o
#include <fcntl.h>
6 x  h* O7 M3 ?/ m% {1 V. s' p; j- `) |* i; Y. x& u& W
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 f7 V( a1 a  ~/ M7 t2 X# P2 o3 W9 q
( D! ]4 S4 b8 _2 @! l/ c% x5 Stypedef struct( [+ `' j5 T( |9 P4 c) c" P: X
{# \% }3 h7 v/ P4 v
        unsigned int a;- _6 M: f4 T0 h' ]
        unsigned int b;
9 b5 b0 H. t' J        unsigned int packet_cout;" h' o/ D" N+ e* h: P* f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' J/ j. o3 d* Z9 J

% a* i( ?& M3 E% T: Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 c4 q: T" d- M' ]: W! M, T
unsigned int count_copy = 0;
) n- d  V3 A$ J) f. u
! c$ }% _! _( N  S& k0 V2 B. g2 S5 s2 d; P: m% Z) J( l
int main()5 a/ e0 j9 @) E
{
+ l( \: ?2 n! z) Y& n# d! b        pRX_MSG_PROTOCOL pshreRAM = NULL;9 L2 B! C* `1 [8 u. D! N9 L
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# k/ Q, b* l% L* T& M: S$ _
; J: N; T: D* h+ i
        while(1)
( z6 @9 w7 P* R5 D6 h) C" f% f        {
9 B  z: G! E+ K. y3 I! M                read_MSG_buffer(pshreRAM);6 q: [& @0 j' @; P
        }                8 e0 j! z" }& P2 v8 b8 s
}; f" x7 t9 {: G

( j6 P1 C9 A8 T7 J. Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( V: Z8 {- \( S# j  m( f) C& \
{
/ M# Q( Z- U* Q! [/ d2 G        RX_MSG_PROTOCOL buf;6 d# ]/ z# F9 f
        
4 ~9 ?8 Q, v; u" ?        buf.a = pshreRAM->a;
8 Q% i  K- ?7 @' y* D' L" @        buf.b = pshreRAM->b;% W0 x2 l2 l  g+ m: n
        buf.packet_cout = pshreRAM->packet_cout;6 u- U) R" z% H$ [- [+ Q, a! D
        + z$ b; S* g  A; t8 z: n
        if(buf.packet_cout != count_copy)2 A+ c6 i9 z& G( B9 I; b- M
        {( K8 Z2 S1 ^7 @  q) j) V
                printf("a is %d\n", buf.a);
( s+ [& {" T# N3 ~6 f                printf("b is %d\n", buf.b);. Y" H$ Y9 }) l9 V
                printf("count is %d\n", buf.packet_cout);
0 H! Z3 A* [1 {8 I+ {2 I                count_copy = buf.packet_cout;
. j; ]2 M+ o, d7 }' A& s6 C        }$ Y# i3 C! i: J3 C
        else
; Q9 K$ |  Q* W/ F, V7 m        {  g* [6 C6 T) e0 l8 ?
                printf("No effective message!");
5 i4 w# K7 V' e        }
1 k4 q  K8 X4 ?}
* X' r5 e5 k: O: @
+ R& a% f/ c; L& l# |5 W0 ]! S- m4 M4 s, r& B# {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 L9 u0 F% U( K使用下面代码,对内存使用了mmap函数后:' Y' a& H0 u0 t+ Q/ U& l/ Y6 {
#include <stdio.h>
  Z* O. P2 T8 l2 k1 d#include <unistd.h>; _& s. p5 u! O8 e) D2 v
#include <sys/mman.h>8 l/ I1 E7 k2 o# z# e6 z+ s
#include <sys/types.h># S6 _5 X+ Z' @# P; ]. u
#include <fcntl.h>  l! q' t5 c( Z& m) q, }

3 \: C& x2 c2 ]  }#define SHAER_RAM_BASE_ADDR    (0x80000000)9 A2 c' Q4 g) A: n% \4 q6 R; H
#define SHAER_RAM_SIZE         (0x20000)   
9 n5 u. x* W+ ^3 W* b
' k* u7 ~2 ]+ O+ Y# b" ltypedef struct6 ]( {! H# r# Z! N* w- |
{  ?! E/ \" O) X/ r
        unsigned int a;; z2 c  T$ [* u% ^, n& N
        unsigned int b;7 r; x4 M4 C* d  a9 }
        unsigned int packet_cout;: y& c3 K) q0 j% F% {+ ]2 M* J  z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" K- k& I7 X5 f! C
& w: Z" D  c4 T, Cvoid read_MSG_buffer(int *baseaddr);
, k; T! P& x# ]# iunsigned int count_copy = 0;
% T" l& V4 g+ o  Q2 Z0 P3 B$ F
5 h- {4 t6 g# h2 V  d, Q: rint main()) [) h- o' u/ J( _- s1 G. Z$ q
{
: t6 ^1 Q$ O/ k3 a        int fd;
0 @5 s# V: H/ x# C% U        int *mem = NULL;% d/ a  v, i( z4 z
% F8 d. N2 H1 R6 k4 d( M, s. |* k
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 N" n# b' o- R        {. L' g2 v4 w1 o, L: ]
                perror("open error");
/ o( M" R2 A0 h8 q. @5 O9 ?  r                return -1;0 \' I$ w- y. a; T8 a
        }4 k9 c. ~9 y1 M: j
        
! K: M! P2 n/ E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- S) g4 @5 v: p9 S$ k8 ^: E- m" w
        while(1)7 D* [( n. _" S  X
        {
, R: M9 p: F7 w! M' N1 k                read_MSG_buffer(mem);
8 ^1 _' ^4 T) m6 I4 G& n! s        }                + @2 B& i" x/ ^. ~9 \, d
}) m; v# U0 c& a; t/ G
' e5 B3 ~1 U) t$ K0 L/ F; e) I9 A5 _
void read_MSG_buffer(int *baseaddr)! ]+ u- W' l4 ], Y5 `( s1 _4 N) [
{
* P8 T/ R6 C) S4 {" m        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 G, o! N; s; }: y0 ^
: \; Q+ ^1 S% I( C+ W& @, a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ o. |3 a7 K( J' B" y& M% ?! H' m2 n+ @7 b7 n/ T' B
        if(pshreRAM->packet_cout != count_copy)
# L( l" \  G7 N5 c: h        {/ D3 l+ I/ r' I" }# g6 H: k
                printf("a is %d\n", pshreRAM->a);
% C; A2 d5 Z! X, \1 n                printf("b is %d\n", pshreRAM->b);
8 j+ v, `1 H& W  r/ U" w                printf("count is %d\n", pshreRAM->packet_cout);3 @- L% r" p. l' [* }
                count_copy = pshreRAM->packet_cout;  v2 Y0 |7 ?0 ?- o( B/ l
        }
7 _# ]2 t( ?8 n3 b( z6 W        else
9 K6 d; J3 E6 ^9 }        {2 e8 g# V4 b; ?
                printf("No effective message!\n");7 ~% ]  d* s* X, o
        }
) I* j6 h- Z3 R9 B) R' M6 Y! b}
/ S2 `/ Y; c* Q% ^# d! X2 @" c, H/ j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: r$ ]4 D! t8 c+ Y9 A
! H' z3 v! C  ?% h/ C7 G

6 x, ]$ c( v( ~6 z) H6 E5 x9 X/ W' R- b. C; m9 g! t! o

% J/ h( g; e( m* g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 21:52 , Processed in 0.041149 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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