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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& T; @4 a) t8 F, W# z9 f" }( q
8 L5 \8 O  k9 m4 m+ S7 kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 @- I4 K" G! p& z' ]+ c
#include <unistd.h>
6 Y! J2 D; X$ e, H! f# D#include <sys/mman.h>
9 x! e5 ?" o0 \5 \* Q) @8 @' I#include <sys/types.h>7 b6 g4 g5 J+ ~2 n- B0 H8 s
#include <fcntl.h>2 H; ?! B5 W+ c* b

# p1 Q' f% }, Z. N2 f#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! a" t+ Y0 n( e: d& n3 ?2 }  A# z8 X9 v( M# b
typedef struct% \: l: J' J9 d; U' n7 i
{7 z3 _, Z4 U5 L5 N" t9 B. k- r
        unsigned int a;
( t2 b) p% H8 ?7 ^; q+ _        unsigned int b;0 D# a9 C/ f: d) z- }, t
        unsigned int packet_cout;
! L- Q$ b. I( I0 h0 H- c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 {) n7 ~' e- |9 s; c2 @/ s$ \5 |2 {# c1 G/ j& i: q( q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ K3 x" N0 r5 S. p7 x& ^; wunsigned int count_copy = 0;6 I$ G$ _/ A- A' b2 q0 K* x( J

$ n; N/ L$ \3 x
$ `! \: p' p9 [0 mint main()5 n8 I$ S+ d: R. E9 k! I8 [
{
5 e* f+ t/ ~, a2 n; d        pRX_MSG_PROTOCOL pshreRAM = NULL;; k3 C. ?. |2 g/ }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 l# y: C) d4 u/ B+ o6 d
7 r) K) K8 V3 i6 i* \& s        while(1)2 Q& i' Z! B% R5 P
        {
- [& @5 [9 Y2 \8 v                read_MSG_buffer(pshreRAM);
' O; d0 r* c3 ?        }               
6 @& z" d" G  D  ]9 Q7 D}5 o2 T5 w: \; s( x

! u) P3 R' l  J% mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 }6 \+ D5 B- {4 O0 T{+ s6 r% r* i' t. h  D) ?
        RX_MSG_PROTOCOL buf;, A+ [' @/ O3 |
        
4 u# A& j/ ?! A. r5 ~4 b        buf.a = pshreRAM->a;
* K5 ^1 ~6 [" f" y' ~: Q# n        buf.b = pshreRAM->b;3 l. m! j- B2 _2 h' n
        buf.packet_cout = pshreRAM->packet_cout;
5 b5 Y  y0 B) z  a3 G7 X$ N) V/ r        3 B" p5 G4 e/ W% h
        if(buf.packet_cout != count_copy)
; k0 g2 F1 Y4 U: ]        {1 P: h# r5 ~) e7 i1 d
                printf("a is %d\n", buf.a);
7 o; y: F, ^, y, i8 @0 b                printf("b is %d\n", buf.b);
( O( A, J6 q) o7 g( }- ]                printf("count is %d\n", buf.packet_cout);
: h4 g1 }' d) A( @                count_copy = buf.packet_cout;
2 z" D2 u& q' }$ W: y1 V        }0 O1 h, e/ c: w/ }5 o' n. r! t2 I
        else
& G8 J7 k( l9 n        {# c( a+ x# @3 B: j8 P
                printf("No effective message!");
: }  V/ r6 L6 o6 k* N1 q        }( P% P0 X& Q; U* @$ [6 w
}( g4 a1 m$ G- B; |( V& {1 U; o

: \2 I( ~* l4 |8 u
* i, V4 a  Z3 T6 S* _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' |: [1 ?" B9 J1 _1 {. D
使用下面代码,对内存使用了mmap函数后:) h4 U. ]% A0 S" \2 q
#include <stdio.h>3 u9 F- |& }) M5 Q% P8 t0 l: W+ @* \
#include <unistd.h>; A" R! u3 m/ ?& b% e  m3 f
#include <sys/mman.h>2 V$ r5 v" w+ R
#include <sys/types.h>
" v5 u; H- ]/ l* o#include <fcntl.h>
7 f( `) W8 r2 o1 ~+ x5 J2 W( w& t: Y7 m1 t% F2 a2 D8 T2 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 ~, H) v/ C+ i. }' [
#define SHAER_RAM_SIZE         (0x20000)   # e7 @! i# w, j) E7 P5 J# S! o

/ f& Z5 z) i, H9 ^$ Ttypedef struct* e: L1 |) I( q5 ?+ V3 O5 m
{9 r7 J- W- p, g0 a
        unsigned int a;
3 D- Y6 F0 m4 H# ]! S) W        unsigned int b;+ O5 l& h5 D+ u8 o9 U
        unsigned int packet_cout;
3 J% w/ z+ O9 U1 C4 P/ n9 U' @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% }: H; P! ?1 `, M. B9 G

, `6 U, p/ Z0 ~- E) Q; Hvoid read_MSG_buffer(int *baseaddr);
- v' \8 U9 F% v- funsigned int count_copy = 0;
3 F. ^9 g# |* p! n, C4 L6 w2 f, i8 s8 f
( M) Q/ \; s  c1 vint main()
7 _6 ^  }2 A% ?1 v{: h7 H- A# h$ ~$ J8 V* y2 M) V
        int fd;
$ a  L: _" S  e; v3 U; o' y        int *mem = NULL;
" ?: ?* J$ d! d) K5 v3 s6 t" D) y3 \" V% ^7 G
        if((fd = open("/dev/mem", O_RDWR)) <0)0 t# D; E9 ^/ T
        {+ c0 U) q" U  W" d$ H4 l8 \* s( d$ a" F
                perror("open error");
# Y' L3 H$ `. C$ e                return -1;8 [' e5 v# J4 h
        }: t- p0 G8 }3 c/ J8 C
        ( T* E5 t' [8 g0 z# F
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& M/ H: j( x" d9 j4 b& h% V
; w! |( \/ f# g" R/ a
        while(1)  ?, C$ L( K  T" S4 c6 o
        {! w0 Q% R. R; Y. V1 m; X8 C8 L
                read_MSG_buffer(mem);2 u; ~2 t1 A. M- @1 a9 @& _0 Q
        }                * ~, Z5 n5 T% N1 y( b
}
1 ?8 J- J6 F. n! Q& v& E: ~
6 f# r7 r+ }7 W2 q3 m+ w3 @4 Gvoid read_MSG_buffer(int *baseaddr)
& K1 G; Q" l) C) \{
/ v0 W, j' F. |! o        pRX_MSG_PROTOCOL pshreRAM = NULL;7 t5 T: j9 D1 C: z: }8 ~! N
2 d# r) R' p; q( E$ o# L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 p3 e; ^/ L. \6 D1 |; G7 D! l+ f/ ]  |, r
        if(pshreRAM->packet_cout != count_copy)
. I% C, m( ~; D) r8 _- h        {4 a) a# Z4 p/ L7 K" R5 U
                printf("a is %d\n", pshreRAM->a);4 O; t  ^9 q  c# ~
                printf("b is %d\n", pshreRAM->b);4 X. n5 n9 \  W1 o0 c3 ^/ I
                printf("count is %d\n", pshreRAM->packet_cout);# [; t8 j# v0 q; y* C1 A
                count_copy = pshreRAM->packet_cout;
2 D2 P* K# L8 G' W        }
; q' ~. K! O  E. V        else, [% W! m7 u" o! I
        {
0 o& }# ^- x+ z, u9 ^; W. p  w) j                printf("No effective message!\n");
7 Z/ U/ I/ J7 o" f/ Z4 o, O) \9 Y# g        }% m8 r" T5 B- E0 M3 ^' X
}
$ _+ w) B/ S$ x1 y$ }$ P) @
- E: C+ O+ z. ~% M5 u$ Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) f2 s( I1 b! P; ^- P; |( A

/ `5 E6 R7 s9 L7 p& s% U. l8 D# i8 M! [) ^" A" u# m$ B, o' O

  `. D4 x9 |- d# z) e: n4 ?. f& U: F( q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 23:16 , Processed in 0.041118 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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