OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( A# P$ R6 v+ R6 \6 |6 {. H3 `7 b, i8 x: x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' D- Q6 ^% o5 n#include <unistd.h>4 d& p% R$ O. q" }( ~3 _
#include <sys/mman.h>
8 g/ }1 b' ^7 V& z* ?#include <sys/types.h>
5 S; D9 _: e8 }, o#include <fcntl.h>
) B% `( u; c, C% d3 t$ A$ h& Y7 T; j) E: R/ J3 o: E) R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # ^. Y; G% j" h; R, b2 ^

! J& U) e0 M- u. z! Z8 Qtypedef struct
6 X7 @" a5 [2 O- p2 ~& Q- I{
' D( U& X( X6 C0 r# M6 m, z! A- F) C        unsigned int a;! s1 a( J' z' V7 t# x/ S" \5 c
        unsigned int b;% {8 j9 r  L2 V" B7 b
        unsigned int packet_cout;( n, \5 K" o9 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. a, p' Q* D. l" C$ k9 v' i/ h3 s! `

0 K7 z. B: ]: H' |2 i) Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 B$ y' A# n; f& {+ ^unsigned int count_copy = 0;
- l; q8 M! |( W# B; Q. D* g0 O$ U2 A2 u* B8 i' Z5 i
% X' z* G5 w( b5 I5 K
int main()
; V  f. c7 V* H. U4 t1 _{! t+ R9 O9 \) w& R6 D# k/ @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# M( {& F' Q5 n6 G2 o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, g5 w+ _! @) q; ?! x% O
4 f( N3 V) A5 B- [, f5 J
        while(1)3 Q- a5 V4 B; `4 |3 I
        {
( R8 Z$ M% G2 G& [! ], o- b% S                read_MSG_buffer(pshreRAM);; \7 j2 y* [  ^# I, O! z% u
        }               
8 @3 v9 g& \/ |8 _: h! K}
- K3 F/ M) {( N  D
4 H! t2 u- ], {+ Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. U" D* U2 W% t9 v) p  h. s{
7 E3 x$ \% E& ~% g6 _7 Q9 [        RX_MSG_PROTOCOL buf;' |  X7 L) \5 g# I
        7 W# O! r& E+ {9 c1 ?
        buf.a = pshreRAM->a;
# c6 d' q4 h* A$ j$ q- J        buf.b = pshreRAM->b;+ n. D1 _( j1 z" W
        buf.packet_cout = pshreRAM->packet_cout;
& ~" K" `  a9 ~$ G& J# u; V        8 c2 s& U9 S* L* z2 s4 g
        if(buf.packet_cout != count_copy)6 U6 [4 ~  E4 t1 x( k
        {
5 \( V; L% R; z% N0 L6 Q5 Z' B                printf("a is %d\n", buf.a);0 R' f5 ?$ S& j( q" r- R( j
                printf("b is %d\n", buf.b);! u6 N9 S8 O& }: y$ R# i( ]
                printf("count is %d\n", buf.packet_cout);
2 H. P! j9 }+ Z& @8 U  k8 K                count_copy = buf.packet_cout;" x7 S) `' o9 `  t
        }, Q% I" B  j0 S$ a# U+ G* ~
        else
. f5 r6 F  U8 ~/ V. T; v" Y$ T& M        {
( D$ L- j. M0 i- f/ _                printf("No effective message!");$ J# S3 W2 m# \: z% O1 Q& z
        }# y/ a, x+ Y  z  S4 e
}* x) r0 [7 s$ l
1 D1 r+ o) D! v# S8 J& B" t

4 u3 \/ n  j* U  ^, N) i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ d+ l% ~$ P- _/ Q' a6 B4 [- ~) i使用下面代码,对内存使用了mmap函数后:6 ]% \* }5 P2 F! R; x5 T& n3 j5 t
#include <stdio.h>$ g$ `$ B- \3 e0 A  T
#include <unistd.h>
0 C" D. E+ B3 Q% Z% N  B#include <sys/mman.h>. T. B$ k% |3 G
#include <sys/types.h>  U; z. s  P0 e* K
#include <fcntl.h>
* P" y: x* ~6 k5 P! B" X
) G% ]5 b5 n3 j& N! n2 o#define SHAER_RAM_BASE_ADDR    (0x80000000)
  s: c+ r; j5 t, ]3 a) W#define SHAER_RAM_SIZE         (0x20000)   
: H, V6 n+ {2 i) k
! m8 p& ~  o- o9 Ptypedef struct( w* g0 p) g4 `- M# H; k, B
{
  p7 f5 Q# w3 f6 i9 Q8 E8 ^        unsigned int a;
( ~; U2 R* d. v4 @2 Y        unsigned int b;
/ i& \$ Z7 X6 M' ?! [; V        unsigned int packet_cout;8 L( R4 `* w( e: F5 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  D! Y6 T2 ?: F
, O  q5 ]0 ^0 a6 ]
void read_MSG_buffer(int *baseaddr);
( z* J7 O. O  _$ qunsigned int count_copy = 0;
) j2 W% L2 a2 A8 K* c3 H. b( {; s1 z  j
int main()5 m# G& Z  v; D! W
{$ H+ h: @/ m" b5 C# n
        int fd;
; x6 J) U  W) H. K        int *mem = NULL;! u8 K/ {8 f5 X5 n8 x  ^
- ]; _' D" U, c+ C/ ]% }4 V- n
        if((fd = open("/dev/mem", O_RDWR)) <0)5 H  Z8 \7 j# l5 X2 G" S7 B2 F6 v
        {6 m2 a' m! ?$ K4 Z$ ]; c
                perror("open error");
0 P1 U6 j, y) x/ }3 A                return -1;! P% J$ C6 A% j7 F* |; R  [& S) ~7 ?, G
        }
- T: A. C/ r6 k/ [. e) v8 ?        
8 K1 F. ~# [: J# x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, m- k2 k6 F6 O9 a2 L& ^' [" ]* V; w5 g6 ~3 @6 o
        while(1)- G7 v& `3 L7 u: D" B
        {; f1 D' T" v) Q) }: ?5 |* P
                read_MSG_buffer(mem);* t# v. E! w0 s1 y  s: `+ I
        }               
# j$ P+ s) P2 Z' _7 S, k1 y8 i}
8 `) @9 _; g! M& u2 y" K- m& ~4 R- V, b
void read_MSG_buffer(int *baseaddr)' D9 V/ S: ~/ n! j$ h$ E
{7 a6 v: Q5 V( \
        pRX_MSG_PROTOCOL pshreRAM = NULL;  X) `3 w# v7 r  G1 E

7 ?7 i# S! m* d$ S) l6 z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" x* E# D$ G- ?' F% `) m

6 }; C* Z; M& i# I/ P, n        if(pshreRAM->packet_cout != count_copy)
: d$ C  i% W  E- q        {6 J! J* R1 M- j# {. V( a
                printf("a is %d\n", pshreRAM->a);
1 x1 ]+ v( O: X+ T+ O; `                printf("b is %d\n", pshreRAM->b);
$ Q4 N3 [( X" A# g, A                printf("count is %d\n", pshreRAM->packet_cout);
$ t: O1 S0 f6 w' O" H) [                count_copy = pshreRAM->packet_cout;: G6 `! e% `0 m
        }2 v3 f2 b2 N: y
        else9 r' q2 S. s" R  Z
        {' T0 x* i+ g% u
                printf("No effective message!\n");* ?/ v% n% M# [& V/ l) N
        }, O! q2 N: x1 t8 v. {
}
& k. }0 ]1 M9 [
$ f& Y+ _# m  J  B/ }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 h- ^& ?6 a, U) q. l0 \5 W
* O6 R5 x  s& v/ H3 {1 t' O
9 [1 S7 P+ x: F5 S9 `8 m6 t$ n# }$ V1 F3 Z
+ W3 q- X( D! V, I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 22:03 , Processed in 0.039390 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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