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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 V3 e+ n+ `. V/ k; L2 I3 O) R& _
* D5 ?2 f7 E6 v) b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" }" h. {3 D, y4 r" {+ t6 j#include <unistd.h>
# ?$ ]: J3 h' i+ y#include <sys/mman.h>& {' P% E( h# @; T$ @* U
#include <sys/types.h>
( @$ ?+ |( u& G#include <fcntl.h>9 d6 L6 o9 R. K- ~! Q
! t. @$ r& F  d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ A0 A+ O  Q% N$ U- O
- p. s5 N* [+ f; F% utypedef struct
0 M& U0 v6 c1 s" b- A  E5 u6 _6 G{* M) h# {- u* f
        unsigned int a;
7 y' }2 `7 ^' E6 Q  I4 m" v        unsigned int b;  H# U1 x9 ]' [. b" Z% Z2 \/ {
        unsigned int packet_cout;
! B( u* O- N" r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" n; ]/ ]' U+ S/ Q
6 w' p. ^' U3 v  P  o2 S- Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 `/ Y0 K# s0 k' \
unsigned int count_copy = 0;
+ J9 }1 o4 T: h) O' F# x/ o1 }
: n. Y  y' C; m& ]* k  I0 p( W* L, C/ h# ]) Q
int main()
. v$ B2 _5 o# f) C! r{: \0 e5 e' H/ |
        pRX_MSG_PROTOCOL pshreRAM = NULL;* d* p4 T9 t% g% e1 F
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 O+ ]- g4 _( {9 p, l( d- e$ q3 g* P- X/ [( W- |
        while(1)
/ m* u: F5 ?& g" u( J0 {9 W        {
' R0 R9 M: L9 o                read_MSG_buffer(pshreRAM);! c; C% k4 ~, j, e& q) Y* z
        }               
9 q" Y6 w) w* k* c4 W! w}: L# h/ q2 ]0 x- L7 y2 t

0 W, }' w. \$ O' t! Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% n6 u% C: P3 H4 R{
4 P2 u+ V9 @6 D" j( _/ q        RX_MSG_PROTOCOL buf;
. {1 @! I, g% L3 k8 m, g4 `        
" g9 m+ A! M. ^! |' L        buf.a = pshreRAM->a;
- l9 Y/ f: `" [& D        buf.b = pshreRAM->b;
5 I+ ^$ z! C& E1 I' B        buf.packet_cout = pshreRAM->packet_cout;+ c/ y2 @3 y( n) D' Z/ D
        ( F& ~9 k0 e6 [# }: f8 J  P
        if(buf.packet_cout != count_copy)
( I! X, \  O  A$ t* ?/ h        {
) F9 V+ L. l7 @; U                printf("a is %d\n", buf.a);
4 n$ n5 x) m1 i5 s  n                printf("b is %d\n", buf.b);
# M; J( e( S' @5 R- l                printf("count is %d\n", buf.packet_cout);
0 i+ @- I9 [8 b9 s  C/ p+ l                count_copy = buf.packet_cout;
5 i- G0 C. o" U% F2 X- P. c8 {1 v        }
7 @% N7 L& \( Z' b* @, p        else
; H* b) H' }9 S        {: M/ C, C" K4 i/ k, C
                printf("No effective message!");
4 p  n' o8 r' L9 T( ^& _3 T7 H        }. H6 k8 o  x/ u
}
) N9 s# o5 f/ Z$ t; C" l7 z) x0 w+ q5 X+ \
3 i7 U0 M8 a5 X! e5 H1 J( n# B. C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- z1 n- B/ ^) b使用下面代码,对内存使用了mmap函数后:
- o' r# z2 U4 }* o/ Q+ L- R. {$ z# p#include <stdio.h>5 s6 k" I( B  K" w2 D! Y6 f
#include <unistd.h>, r4 F( _$ c+ R3 I* W
#include <sys/mman.h>3 L: r" E8 f: ]/ b- l# \) J
#include <sys/types.h># v1 ^2 R' h& p, }' d1 j; m. x
#include <fcntl.h>
9 [0 J- u& c% g: f( ^) x
# X9 A% p# |! }$ J#define SHAER_RAM_BASE_ADDR    (0x80000000)- `% j7 z, P' ^9 E9 ~+ E% Z) G
#define SHAER_RAM_SIZE         (0x20000)   " a; w0 s/ i; k

0 x0 H: ^9 r7 u+ Ttypedef struct; Z! M" d: J0 a1 i
{$ I: k) t7 k3 _$ D, H
        unsigned int a;: `+ ]+ d. p; B7 P1 x& t; K+ R
        unsigned int b;
. @# ~$ Y- L6 {$ u0 t- M$ I$ W        unsigned int packet_cout;
* @+ s) H) T- W- R( u8 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ J1 [! w; C" S% c; o5 g" v1 A7 n$ ]+ `/ _8 j
void read_MSG_buffer(int *baseaddr);' z/ s% ~* Q7 O
unsigned int count_copy = 0;: |1 b7 `4 l/ O4 ]0 U5 N6 p- a& x4 M

. R0 N% Y( v. K+ T% lint main()
* u, o( A/ b0 Z% W1 f6 x' m{
: u# Q: O& F, h  @' m( s3 j: H        int fd;9 Q+ G9 S6 f9 {
        int *mem = NULL;# J; @$ _3 s% l) I  k( N& J- j

2 Y( S5 P2 U0 }' P4 j        if((fd = open("/dev/mem", O_RDWR)) <0)
, e+ t1 v$ }: ]! h' A' E% F8 _        {) W7 C% ^* _! a1 B
                perror("open error");
$ i- V4 W- R% i* U                return -1;
6 x' y: i- Q8 W" Q! H- B        }
0 g) b0 R( Z3 f- a& B7 J' \% z        . W0 i/ F, N* X5 M. O# ]
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 H' \" _. |# @3 g0 s% }9 b

3 S' A) F5 \- }! ]) f1 `5 g$ h        while(1); ?% F8 U7 A9 f8 f, l- n5 m3 d
        {. O( x: @" X3 `
                read_MSG_buffer(mem);0 Y7 _  D! b4 P. C& ?/ Y; I7 {
        }               
0 G# @8 r& i& ~  g) @2 |/ P}
/ F1 E. ]: Z2 x- v  Z) p# O6 `; D5 K; O$ F) @
void read_MSG_buffer(int *baseaddr)& N: c( H# u, C  A, \8 `# p
{
' i1 Z3 A6 H# e" F; S        pRX_MSG_PROTOCOL pshreRAM = NULL;8 _4 X7 q9 B; F) m4 F' }
) r8 S6 Z/ m; O9 c+ ]0 M/ M/ S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& b: J3 b! O& ?3 E* @( L6 _5 E
. s2 G$ Z* _3 |4 p. b3 N: N) r. q+ ~        if(pshreRAM->packet_cout != count_copy)
& r3 M7 }; {$ Y2 s# t        {, J' n2 X+ v" ~: [
                printf("a is %d\n", pshreRAM->a);
& @9 V0 W7 K, Y" s3 c; G7 [$ k                printf("b is %d\n", pshreRAM->b);% O: c- a/ w9 q5 M
                printf("count is %d\n", pshreRAM->packet_cout);$ r" V6 c$ y9 j; G; s6 z
                count_copy = pshreRAM->packet_cout;2 u% ?& H% Z+ V5 ]6 ^
        }' J. X5 Q$ `& h. M
        else! V' M6 n  W/ c. ?1 }7 w3 `$ \5 t, N
        {
. Y* x  X2 L4 n7 d$ G                printf("No effective message!\n");8 t5 ]7 L/ @# v, _' r9 v
        }
! T' `$ @& y0 \7 R$ V5 U/ l}& T/ {- \9 l% |4 t5 C
( J3 `/ [; h% `0 _9 p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 D, H2 w2 ^* A* E% J
& a2 k3 I- O. n5 r$ A: Z: t5 U
3 w: ^' B6 {, ?# C+ w, N' E5 w4 e" O3 R" i+ r6 P

) ?) Z/ x* ~; p% B: t1 q; I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 03:47 , Processed in 0.051818 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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