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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. r$ P& G: ~; L& V6 z: V
7 l, r* g3 {& r" _: x: N* y2 J4 c  k5 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" D, k* ^* F* h# y1 f#include <unistd.h>
: U0 C9 N. N2 m# }#include <sys/mman.h>& n% U: p. S3 x8 g/ v' V; [( V+ t4 a. C$ F7 q
#include <sys/types.h>- f- o1 U1 d/ \5 I- R* X
#include <fcntl.h>
- o% \) {  O6 U) R' M) k9 H) F5 u, z! t6 ?8 @# i
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 n1 c; Z8 a! j% y. w  Y2 s4 s* p! o4 F* M! h  }: W
typedef struct
3 ]2 h6 g0 U! v* A. g, O9 y4 D{
' G' _! T# g2 c2 \: f        unsigned int a;
$ Z; P( `7 f1 Y6 Q! Z. }        unsigned int b;5 \: U% ^, \( h/ N6 @
        unsigned int packet_cout;
6 C# C' r9 e/ A( D! W- m3 L5 X) X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ H7 f( J) U$ a) C7 f. U
$ @$ r1 @7 F/ @4 ?% `4 ~9 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; f  ~/ B5 [  v0 {, ^# J9 ounsigned int count_copy = 0;
$ x4 N7 }* C1 H+ C8 C  c: `/ \0 W1 s6 {- t

/ V: Z% e8 \8 m# Q, ]int main()& B  c& {7 \- _! H/ m" j
{
& J4 g# x% I2 z+ |        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m1 q5 l1 t/ [% W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* @1 G3 N9 u* k# k- N" f/ A# y. Y7 R, r
        while(1)) s' t1 G1 b5 \' i
        {! D/ l/ D- X0 Y, {
                read_MSG_buffer(pshreRAM);3 n) |" C, o, ]( N) a9 _
        }                1 B5 K9 Q. U7 h8 F7 X
}) n. ^. y% B: s0 V' N* N+ ]

; c7 g4 G$ D: ?8 R) n7 _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 j$ [6 s% e6 R4 S{
4 a! A# }8 Q9 K( q: p. |2 F  Y        RX_MSG_PROTOCOL buf;
+ `$ ~( l: d: W$ |8 m6 f  P  @& ]        
. B* t0 t( y6 C4 V        buf.a = pshreRAM->a;& d" C/ `2 R! U" K; n  p. S
        buf.b = pshreRAM->b;
8 c& u, b" z! I1 \8 P/ P& H# L        buf.packet_cout = pshreRAM->packet_cout;
( q7 F8 M) w3 J/ Q3 |6 J        2 K4 V  b9 u% C2 G/ m
        if(buf.packet_cout != count_copy)" A8 w1 e0 M/ b( ]6 |$ A1 P) j% O8 R
        {
. u7 l/ T* c: t1 \                printf("a is %d\n", buf.a);
; n+ h# j- k9 H* K                printf("b is %d\n", buf.b);
$ V* i! r! z. R3 N6 ?4 S                printf("count is %d\n", buf.packet_cout);& Z1 p+ h6 g; j4 b$ _
                count_copy = buf.packet_cout;/ ]* K& V& M  B0 _
        }; W$ \# C& M! Q- V- R% X
        else
% E# K0 j* z$ b# y        {; U1 o; X$ H- N1 z. G& v3 s  D+ J
                printf("No effective message!");5 P6 J. ^% W% q
        }
7 m$ [  @$ K3 z}
# K7 P/ }! @0 B: X6 d4 O6 Q; P) d: }1 ]: H

/ e3 j, F; ?7 [1 j, B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# |( s% |. V1 F/ C! }4 ^' F9 ^" d使用下面代码,对内存使用了mmap函数后:5 V/ H& i% C! w' J# f
#include <stdio.h>
* v( {, G  ]9 Q#include <unistd.h>- P, ^  F" @; z0 M1 C. \
#include <sys/mman.h>, p. |  }$ x/ x* e# U3 W/ e
#include <sys/types.h>! c/ A; \( V, C$ a3 @7 U+ m# [
#include <fcntl.h>
3 n& ?( b/ j/ e% n, y
7 h0 \3 r' V, i7 k#define SHAER_RAM_BASE_ADDR    (0x80000000)0 |1 W  {2 p: x) x) H2 v: h
#define SHAER_RAM_SIZE         (0x20000)   " r1 d. L" c8 W- p4 c, W. Z8 z3 L
4 |6 E$ F! R+ q% R
typedef struct8 D" V( u: ~1 y- ?
{3 e" a; e/ `2 W
        unsigned int a;9 }4 Y) s0 B+ f3 Z4 T' @, S
        unsigned int b;: J6 }9 k% e/ w6 z
        unsigned int packet_cout;
+ F- E2 |$ X2 l& o: q# ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 E2 d0 L3 U, b, |! o
% S  E1 \4 H% a5 L! t  Svoid read_MSG_buffer(int *baseaddr);; t; L( U& [8 s. q( |
unsigned int count_copy = 0;
( Y7 g' J1 d" [$ m
5 l5 G$ `" T( n3 E  cint main()( O3 z- |* _1 e8 O0 P7 h4 Y1 |6 R
{
, T, n! M- c6 q, v2 k        int fd;
' C( P  f4 `! \( _9 ?1 p. a$ b        int *mem = NULL;
; ~( n% O4 h) Y4 P6 |  o! H& b, Z( t; c8 I
        if((fd = open("/dev/mem", O_RDWR)) <0)
0 c8 N/ \) K- r0 L: J        {" V" l6 m9 X3 N7 P
                perror("open error");0 u% a) J; A# X+ F
                return -1;
. |) a) v  z" h5 L" ?  C% u$ P        }1 U5 N' E0 D% Y
        
* T/ x( }" }. O7 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 B" y. H6 X4 t7 n! R# V! @- B) V2 k" ^& I# l" |) Y1 S
        while(1)
* Y8 X, z; `% T. \. A        {1 t5 [) V" ~, x+ Q
                read_MSG_buffer(mem);
6 ~! x3 U2 {9 `3 I( _+ M        }                & t4 N1 X, \4 l+ V% A  S9 |/ S
}) @% c% s/ J) k/ D

4 O4 Z6 j9 B+ w1 fvoid read_MSG_buffer(int *baseaddr)
. E: Y/ @% u# Z" E{, A4 U: j2 f/ J% W8 Z5 V
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 N9 F. l. @+ k9 \8 [
: ?; o6 w( d5 E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% G, k% l$ i, G( @5 h4 t) x

* ^# d/ Y; V1 L        if(pshreRAM->packet_cout != count_copy): e+ M/ y7 U8 k0 H. E) U' H
        {
6 H* y- {. W3 q7 E; Y2 D  c. \                printf("a is %d\n", pshreRAM->a);
7 V  {8 V/ Q, \5 u3 z6 w                printf("b is %d\n", pshreRAM->b);
5 t7 T1 A6 D' H, \) E& B                printf("count is %d\n", pshreRAM->packet_cout);5 P7 E$ O) n7 ^
                count_copy = pshreRAM->packet_cout;
. F2 N: _) `8 H* |/ _$ S        }) ~) W% V9 k  @" Q7 M: q
        else6 a3 D+ F0 A, s
        {
) {5 L. C7 J" n% R! L% K& B0 n                printf("No effective message!\n");$ `4 e0 K% E- M' P5 U
        }
5 @" m. d6 B: F}
: e: z' m+ I$ `: n+ O  X
: v2 X! q) E+ e+ J' L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# P; m( `' N% n9 R8 X& V, g7 |1 g1 O. }# X5 t' i
9 m# q7 |! g& ^8 m# E# @

  T! a7 P! }$ n8 {+ T: y. y+ R8 d* k5 H. O/ h  c: U6 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 07:58 , Processed in 0.040994 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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