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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & l2 f' k3 s9 g
$ }1 Z3 r$ y$ T; \; ]! L) z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 S: I3 L, v- b4 d* O2 t
#include <unistd.h>3 l$ W) Y$ G: p% V7 B
#include <sys/mman.h>. F& P  e: _' H* q
#include <sys/types.h>4 a; b* j' |- T; j' ?2 z
#include <fcntl.h>' l+ S3 Z& {  Q. e' D) x
* e* K' }+ Y* p: `7 a; O* J, k( f5 F+ b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; E/ M9 m7 ?/ a) `" [. u. W
% E- [% D: {- v+ Ctypedef struct
! N: [# R) N8 n% w! W; J{
9 f. C& K( K, ]. G# w! g        unsigned int a;
5 x5 A6 w* s* j) \# U9 }        unsigned int b;( O/ ~% [8 [8 m8 t' m0 X
        unsigned int packet_cout;
3 F) h0 Y% K) E7 F, |- C, G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 f, k2 ^" u" `! x
" l% J) R6 H- `  H3 P; Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* q1 n9 P. ^5 s' _- A$ Y  y) |9 ?" x
unsigned int count_copy = 0;6 W( J9 T8 D, K& m) }( U( B

0 F% g. r& D2 M! P2 ?9 N1 b; L, _5 y7 U+ q- z  o8 n# A* S
int main()
. ?1 n* t  ~& ~& Y{
( w3 C6 j1 P/ Y        pRX_MSG_PROTOCOL pshreRAM = NULL;0 o0 |$ D$ Z7 k0 i4 J/ t7 ?0 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ g; o- Q7 |8 L. Q, K
4 O) Q8 ]0 B+ ^0 E
        while(1)2 B( m  t) p9 Q' V5 a4 g
        {% P( \. J7 [9 [- }* m$ n$ O
                read_MSG_buffer(pshreRAM);
4 x1 a8 S- q# N& q3 m+ y$ X        }               
& o, C: j5 n. |( K4 Y6 W6 J}) d* v% j3 ?, v+ c, R7 H9 ~/ a: K

4 G4 i; `: u. `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# b- |# f) t+ B( Y{1 W7 ^9 N( S% Z9 M) R8 c
        RX_MSG_PROTOCOL buf;0 \  E2 D$ P) z( D4 c  u# k5 t
        7 s3 J$ q6 l  ~7 e: h# J9 C
        buf.a = pshreRAM->a;( k* |9 C8 K% T
        buf.b = pshreRAM->b;
' q6 ~) K2 I2 s+ M: k) Z        buf.packet_cout = pshreRAM->packet_cout;- _# q& j8 B9 O: U
        ; ]/ p# H8 \# f$ @" M# H
        if(buf.packet_cout != count_copy)
& P) r6 Y( O9 T- f8 j9 b5 b        {
; O  E/ z4 I  F/ K% B; B/ ?# F                printf("a is %d\n", buf.a);) d; O& u/ p& |  h5 M2 M
                printf("b is %d\n", buf.b);% E/ |! H( ?  t: o
                printf("count is %d\n", buf.packet_cout);, Z. }- ~. m  K
                count_copy = buf.packet_cout;6 D$ b% v/ N3 D6 g* K
        }; F4 Y. d3 y- b0 v' N  f( |
        else; y' h. }+ ?0 ~% V* g5 x3 I
        {% o! ?) E, l8 s. f& X2 O
                printf("No effective message!");
! a' d* B; A7 K! c5 J, u- O        }! v1 T- S8 x; b/ P5 G2 [! {! K
}# s9 G% P4 P& k# ?9 R
5 C) q4 G1 L7 J8 i' j, U0 @# o
* y( n+ z5 m- i8 |5 ]  O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 I" f" N& K; P# T
使用下面代码,对内存使用了mmap函数后:
7 P5 k4 L' t7 W( J, x3 Z1 j#include <stdio.h>' j* T% z3 ]: q
#include <unistd.h>
; c9 O7 `2 {- {+ h+ S#include <sys/mman.h>
% f2 Z" k' N7 e( q2 E0 H% j#include <sys/types.h>
$ b% ]# H4 V- a: F7 g#include <fcntl.h>
, D& N2 t0 _5 T. p  F$ Q7 A- \4 J- {+ y" v( Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)% r+ s/ C, }5 z
#define SHAER_RAM_SIZE         (0x20000)   * f* u' {# f: w
1 ~" i& k5 w$ d, A! t0 \
typedef struct( ]$ \- j# @/ e
{! [- S' a% F$ x  r# C1 ~/ t
        unsigned int a;
, \7 t- c( ~: A4 L1 ]% B+ n3 N        unsigned int b;' [! g" K- N9 r6 i7 ~
        unsigned int packet_cout;) h0 l/ F8 U! G4 |/ D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 n/ t% `' O. d- K! \
; Y! Y! @# `  N2 E0 E, M- Svoid read_MSG_buffer(int *baseaddr);
; u9 C# u8 e; f  i( Y0 Tunsigned int count_copy = 0;
6 q3 ~, Z+ H2 ^; p: r; R8 {$ d+ j- ~6 o  E8 l# k
int main()) P0 Q) n' y) _; v2 Y
{/ d0 g& a! ?, @. l9 c  h
        int fd;
3 S  g- ]) g1 Z1 U6 t        int *mem = NULL;
/ G8 }* f( ~1 ]8 P# j$ U5 H5 N1 f2 Q* E" D# D
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 q* U1 W% Z. Z+ h$ F        {
( c4 e5 x: R, G' e6 x# R: {                perror("open error");& h4 T$ ~! D: f3 ^5 \% {/ x5 d) U" _
                return -1;+ {1 g) x, F  V# B8 Q6 ?
        }( D8 v0 J) e1 n4 X" ?
        
. f" Q/ P  X' g  @8 Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* S6 |( A; \. `" K
2 ?1 j/ I: T0 H' X5 R, v7 R
        while(1)' ^3 \. }5 P. Y7 V. r/ x& M
        {
( c$ b1 X  R- r: s. j                read_MSG_buffer(mem);
, N' z. a+ O/ v' O7 l0 F1 y        }               
7 `4 k* X4 r3 p/ k! y5 F) V}- K% W! K6 o1 j
1 c: T2 k, y& Y' C# I
void read_MSG_buffer(int *baseaddr)
; V! X% ]8 n3 n$ f9 }6 W{1 ]. U( ~/ t0 P: {' W
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" a( t! W5 X( I1 C8 Z
" K& h" y- R$ M1 G8 I        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# a. P8 E6 ^3 s5 q4 j% _. l6 R4 l( r2 K; m
        if(pshreRAM->packet_cout != count_copy)
& @+ a( e$ h0 ]        {; B) Q, x* |) W2 o( s3 C. X
                printf("a is %d\n", pshreRAM->a);
6 V& J) J3 @9 }0 y- x* i( F3 g                printf("b is %d\n", pshreRAM->b);+ b/ A: [( O. ~: t! m) D' _( ~
                printf("count is %d\n", pshreRAM->packet_cout);
" j- ]. Q4 J) Q6 h" M, F                count_copy = pshreRAM->packet_cout;& y% A. g* O/ c; f
        }
2 Y6 K& m4 J1 B9 `8 }2 b        else( t& O8 P* _+ F% W
        {7 I1 q, i9 z1 ^! g4 V% e! G8 A
                printf("No effective message!\n");
6 O8 B, F1 q: a; r% `3 E        }4 m$ V0 H  ]# q" Z
}
% R1 D5 M- j5 j; Y8 X1 w' i. ]9 E& g' T+ Y, Q0 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# b  t/ r, Z6 w; E9 O

8 }' I& c' ~3 A2 M0 M3 }- Z3 W8 r% {# ?7 {( o
  ?. q' I7 P( H: T

. f& A+ d+ @# E/ ?& f  a8 x$ v5 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 18:31 , Processed in 0.039471 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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