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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - [* Y. u) X# Q6 ?0 O. U) }& [% T' t- X
1 r3 y3 @$ h( k8 X" L1 }" z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 T( [  Y1 q/ l* P# f' W#include <unistd.h>
* f: l1 f- n# }+ G% o4 i0 K* P#include <sys/mman.h>& V7 @! k% Q/ T3 m3 J
#include <sys/types.h>/ C6 p0 B7 P; G0 s! q6 r
#include <fcntl.h>
- l8 i, @! z5 Z& C: s4 s, m* ^; A8 V) [& ~2 a, S6 n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% n1 L2 |+ |# e/ z' j9 H0 b
6 R8 S* k" H( Mtypedef struct
! z9 W+ E  ?/ E# ^{
" y+ ~) Z; a7 x5 f  j        unsigned int a;
& F) t- m- b/ z        unsigned int b;
5 O3 @! U) A& r6 T7 u. R        unsigned int packet_cout;; ~7 U- I$ I+ J8 x9 H" l' O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 u: D  U" @2 ^+ _
1 {% Y0 H/ M( y+ q0 U5 C( {) V' e& nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' O4 F* h' ]( d2 v+ i/ t
unsigned int count_copy = 0;
- Z% G, F) o* z. Y8 a1 S
) z/ g8 J) l1 n" G/ [2 ]
+ ?$ D( @) R) `& m: @! j  Nint main()  J' d& O* o# \7 x: b4 Y$ N
{
3 y6 n. D3 o# G" b2 t. |2 O2 g# z2 l        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 ?0 ]4 @% P  h6 [0 y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 p" [1 L  A4 q8 Y9 P
0 N! E/ b3 t3 y9 s; d8 O: a& k; m        while(1)
! P5 s, }8 O# s( c        {
4 N5 }2 {, a4 ]$ n                read_MSG_buffer(pshreRAM);
! S4 `8 J# W8 j3 V9 h        }               
7 F; w/ S" t+ `  ?}
( S8 S$ h+ `; T, D8 h. v
1 _  g$ p) M+ W* @% C* B5 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 W, z% O! ?5 `1 V- M
{
4 L; k7 m1 N4 ?8 t* F# |& n9 j: X1 Z! ]        RX_MSG_PROTOCOL buf;" ~; L# I9 `" J( `9 G+ _. P
        + M: E6 z2 ?- \3 C4 b
        buf.a = pshreRAM->a;
9 g: \+ \, {6 q% C: w6 U        buf.b = pshreRAM->b;
0 [; c8 w( I5 N        buf.packet_cout = pshreRAM->packet_cout;
0 S9 Q* `2 |8 Q9 |$ i, o: t        
1 ^  Y5 e4 m* x+ g* n        if(buf.packet_cout != count_copy)
( F: m  |3 J; Y& t2 i' a6 v, l: a! F        {
5 ~1 \4 T3 i5 L8 E: f! w5 Z2 i2 c! l                printf("a is %d\n", buf.a);, m! \/ Y) k$ o0 M; [
                printf("b is %d\n", buf.b);
. x" v8 N# E- G" U5 I' {                printf("count is %d\n", buf.packet_cout);
3 U6 ~. X* A$ s' W: t                count_copy = buf.packet_cout;
6 B+ X- x( r+ [$ w$ s8 P& m. v        }
# r, e2 C- E6 B$ y3 m        else
/ J$ z5 s2 j1 A1 y: C$ G# w2 w  B        {3 S% R0 s- n/ T  n2 r' C
                printf("No effective message!");8 ^4 B3 e* z* W
        }+ j" w1 b8 M$ n: P
}
  C/ w+ }9 [0 J, ^9 b9 T
" S- u, R. Y8 n$ ?$ a( u
4 r' K" N" }" s3 m4 \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% r. @1 m8 R6 p' q$ Q2 x* N
使用下面代码,对内存使用了mmap函数后:2 m5 ^& }! H/ t
#include <stdio.h>
+ a% j# R5 a5 a+ T( p) j! G; C#include <unistd.h>
6 J3 F; y8 A# z  f& w#include <sys/mman.h>* \% Z0 p+ y7 \; l- S- K
#include <sys/types.h>$ _8 j6 ?: y) U" S# d( g* i
#include <fcntl.h>
+ I& u/ b/ N& L2 }/ a, \. K2 w
6 B1 U! ?: a- k5 O; f, ?0 _& @2 J#define SHAER_RAM_BASE_ADDR    (0x80000000)) f; K! g' K$ Z; j
#define SHAER_RAM_SIZE         (0x20000)   8 s6 e3 H6 Z# |! j, i6 L9 l' J

7 `. e/ ]9 m/ ctypedef struct: _; ]* p/ C8 W3 N' V* u
{
9 |( E" L9 y- _        unsigned int a;6 J+ B# @9 b5 K4 U9 E( J& f, D8 h
        unsigned int b;+ C* t; y5 M- W# F
        unsigned int packet_cout;& F8 ~. X. S5 ~/ B$ [6 \- v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 k$ O5 u" l: r' B. C
1 }5 j) B9 n0 B" y' wvoid read_MSG_buffer(int *baseaddr);
' s$ X3 |9 D- ]/ k$ k) b  Tunsigned int count_copy = 0;6 [" G3 G3 F3 l( b

0 _; m3 [! n  Z6 L9 ^) X7 |3 Fint main()
  S: i; t3 b+ v  i{
% f# W1 }) v+ J$ c; S% r/ y+ K% \4 s2 ~        int fd;
# H" B$ k& z1 L. i' q8 f0 Y        int *mem = NULL;2 N, B8 m4 _6 r

1 I. b3 [! E, ]/ V$ U! j6 S* I        if((fd = open("/dev/mem", O_RDWR)) <0)* ^% ^6 D2 G: m
        {8 O! V: C' @& A$ O8 B5 e
                perror("open error");' L, q; k5 G9 D0 Q! j
                return -1;
$ l  I  H9 K  t- P5 }6 e% A        }
& U( F8 E0 K: K: G, q: s+ {% e1 W        1 D% ^3 N8 @5 y9 v9 U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 T) O( M) X7 y+ [: x4 Q3 O5 ?
; v0 l, u6 {. ?# U0 ]' m" l        while(1)* L3 S! K% s; G- {% |
        {- d; B0 c, a' ]  T0 b
                read_MSG_buffer(mem);# J6 g( {# C$ E: n  Z! r9 C
        }               
' c8 W3 G5 B/ r}  @& _- E, n8 y
5 S  p9 N1 V) W1 T9 V" I  L) R
void read_MSG_buffer(int *baseaddr)( Y7 A/ ~7 x$ f6 n( I# I8 j- W
{
1 G7 u: S& m* F' B$ k        pRX_MSG_PROTOCOL pshreRAM = NULL;1 L$ U& j7 a+ K6 X5 o9 P

4 K$ B5 X; V7 P        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! J; L# x# F3 I) R# h6 \! ?

( N* o6 W9 b3 m0 e2 X        if(pshreRAM->packet_cout != count_copy)
4 \  E/ h* b. H9 Q- ]- G/ `) s3 @        {  ~& M& i- d; t% T* q) Y0 q
                printf("a is %d\n", pshreRAM->a);
$ E  f; L5 i, a6 k0 S5 k) Z                printf("b is %d\n", pshreRAM->b);; W1 @% \8 E3 N
                printf("count is %d\n", pshreRAM->packet_cout);' N% \6 I' L! x  Q
                count_copy = pshreRAM->packet_cout;( N  a$ x2 V6 [6 }
        }
; d" ?* ]2 B9 C/ m# N; p2 \' g        else+ M6 p# R, n4 P! a  X
        {% q8 W6 @& g3 c. q, d* |' N
                printf("No effective message!\n");
( p1 W5 q8 Z* D9 ?' x* [  h        }9 \9 |8 O$ C9 q% @2 ?
}
  R( s7 i% G( J& F8 T2 o+ y) L  i. J9 c* x0 {* K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( o* v; P7 {; G- D5 _9 Y- o) }4 q* X3 T* Y

. k6 g7 o1 L2 \! ^
; x% \9 \- [3 W$ x! W
$ G* C3 h7 @$ d' |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 10:07 , Processed in 0.046969 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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