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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' P9 i! ~& C* o* [3 M  P
9 i  ?+ `1 Z+ p5 t) h3 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- I* G) L3 c  T0 g( x
#include <unistd.h>
0 ?% X- I8 F6 W; p8 C+ T/ `/ a, E#include <sys/mman.h>: K' i: p" S3 {0 @8 H
#include <sys/types.h>
- @; c7 Y/ _$ _& E! x#include <fcntl.h>
2 g$ x/ u# c7 g$ _, B; `& B$ b8 V( M# D
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : j% B2 q0 q: H: c
4 f4 s6 S- f5 V* O
typedef struct# O+ @9 o4 F1 X! _: Z" P
{2 k9 j$ n; b6 n( `% y- f' b
        unsigned int a;" \5 g$ l; K2 K# M
        unsigned int b;
( L3 p; G* H4 q( J        unsigned int packet_cout;/ c  S' ~  r8 S8 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) O* F6 U- ]7 z
! p/ _& n4 [' I5 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- @/ x; Y6 D) R$ o5 u
unsigned int count_copy = 0;/ y( E( `: q, o/ X% B8 h3 |2 E3 `
' n1 d+ }# H" g' }

5 j' t! M7 T6 Tint main()
: z3 x' M3 [3 Y8 l  i! C6 Q' k7 R{
5 x2 E. T2 s" v$ h' F9 r        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 @$ a9 P4 l$ y, v5 x, T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ ~' x$ S: ?2 Z! ?
& N* k0 g+ @' v- }" P4 d- h8 X1 Z        while(1)4 x- ^2 A( O6 j" h( ~! i: \! ~
        {
0 F) R6 w: ^% t( z* x                read_MSG_buffer(pshreRAM);
. h. p- h8 z! H# R+ M$ n* {- Y% v        }               
; D7 p$ F1 R5 m$ P4 |( k! E}
5 l. U$ C' M: K8 P# x9 d% B) A; a* ]# |
. c% u( |# ?9 |( C+ ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 r' `" d3 F3 E7 ?# g- I' r
{& i( F2 g8 G* B) u4 `2 _
        RX_MSG_PROTOCOL buf;7 F) U; H9 \! _  a
        ! m, d/ V' ^% B: W* b
        buf.a = pshreRAM->a;
! q9 O3 B$ Z8 K7 Y4 e/ e- m8 x        buf.b = pshreRAM->b;- K* s1 |/ u$ l6 v6 d" ]) p
        buf.packet_cout = pshreRAM->packet_cout;
, Z) u3 u4 B( U, Q- V# Q        
, t7 [" o+ @7 `) n        if(buf.packet_cout != count_copy)
, e* _1 `1 u! \) s2 I- [. {  u        {& w: J: [: E) T/ C" b
                printf("a is %d\n", buf.a);+ p3 H" w. t" g/ w. y
                printf("b is %d\n", buf.b);% L  w. d5 j; G) f4 F, _
                printf("count is %d\n", buf.packet_cout);
' A6 c- D) ?; y6 j/ U  }, L( {8 q  N                count_copy = buf.packet_cout;( j0 I+ @$ S9 e2 t
        }2 A. s( N1 X' Y
        else
' _# k( Z5 N$ N2 G+ \! }        {
) L: x6 z! k. e                printf("No effective message!");$ H# t/ g8 a/ W5 ]: ?5 f  n# S
        }
- s  Z& x6 w/ q" ], X+ [5 Q}( o3 s7 e- z& Y% K  C% q* b' g
, Y; p8 E  l. p: n3 [- r0 e8 P, I
2 O" ]# G; _+ @# ~  J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" p- \5 ]$ h& f% [% J
使用下面代码,对内存使用了mmap函数后:  U3 _5 |& s" J- D1 H" \/ M  g
#include <stdio.h>& o7 q) v& U6 F
#include <unistd.h>. g: u0 T3 p* e. j2 H0 a7 l5 |' M
#include <sys/mman.h>
- m/ j3 h& ?( @. \#include <sys/types.h>  P+ D2 k- O4 [9 f: r, }8 W) J
#include <fcntl.h>7 B: N6 r1 P& G- M, k2 F
8 [  f$ [: }9 d$ }
#define SHAER_RAM_BASE_ADDR    (0x80000000)
& X/ n8 }5 m( s' H; Y4 o#define SHAER_RAM_SIZE         (0x20000)   
# J: O& J" G* Q7 a$ Z* U) d2 R$ [# t5 _1 z9 W
typedef struct
- Y2 H: F" q5 X- L; R% i2 y{
: O* m# m" S+ R" l* J1 ?5 @        unsigned int a;
, G2 }2 y( A" }) Y" v! ^$ Y6 N5 s        unsigned int b;
& |& d, v. ~, G; ~+ {        unsigned int packet_cout;0 J% R! q3 J& `8 L! S+ C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  L" i3 @+ k9 w5 _% M* m
" e' j, Q9 G: W3 m" S( f
void read_MSG_buffer(int *baseaddr);5 }* X- ~7 m# _  [
unsigned int count_copy = 0;
$ m, @. @, O! o  j+ d
4 b( S4 @  h5 C  Fint main()
! p0 X5 {3 i7 q0 U  y{
0 |9 }" M" Q2 Q/ |        int fd;
6 @1 B; w* _3 {! {        int *mem = NULL;
1 o- _& A2 T/ z5 J) ~- h9 V
3 b7 ^' e9 I6 n. g$ [8 ?        if((fd = open("/dev/mem", O_RDWR)) <0)" N- D5 ^& n1 d, n% Q" j5 |( A9 d
        {
$ Z0 v2 }' O& F8 o                perror("open error");; l: X9 ]4 j! w. P; S
                return -1;- O6 H, k, m6 p/ u
        }8 U3 X0 A0 d, ]# h+ Y* ]$ w/ C
        " |; }7 f# K! r3 p. }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ U1 X8 q3 W! `; Q. ~) |9 y9 A1 f; o, U8 f4 ^; q. _; o$ K# J5 Q
        while(1)
( W9 z/ A( k; E; h$ D. N0 T# \        {* K% a; G- f, o
                read_MSG_buffer(mem);  v2 Z6 d/ C3 A9 |. u9 V; n9 x
        }               
1 I$ B! @8 U, E2 M( }" V}3 |3 L7 n/ Y. g- B  y
8 \& R8 `5 \! D' A/ d- U
void read_MSG_buffer(int *baseaddr)% E$ d5 W# L0 A4 i
{8 G! F8 p  V' T6 k- \7 e
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ S* {( J8 Q2 |
# U8 j) A0 q! r( G0 h; \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 N/ X  G8 O- e, K+ Q( i6 U9 y+ t" g$ s
        if(pshreRAM->packet_cout != count_copy)
) o2 u! t( i/ N9 C7 F/ i        {
5 X- ]' _3 z$ B; u3 m                printf("a is %d\n", pshreRAM->a);/ K( w/ D+ K3 H5 y- [/ t
                printf("b is %d\n", pshreRAM->b);$ U0 F- u1 c3 K* Q  [2 n
                printf("count is %d\n", pshreRAM->packet_cout);
3 O( Z  q" @9 l1 H; y0 w1 R- o7 V0 j                count_copy = pshreRAM->packet_cout;) L6 l+ b" O! q$ j8 T; _! Y
        }
$ @( p2 t) a8 {6 d        else3 j2 d& i. t/ a4 l% C
        {
. G$ o2 y$ H4 W7 t                printf("No effective message!\n");# a6 Z( p9 w8 w! m) j( m3 f7 I  A
        }0 d' C* K: u/ E, S# w0 M
}- F; i- s1 [3 w1 \- V6 r
$ X+ U( b; g6 ?, L6 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 l5 E9 u9 W  B+ H
- z0 U- \5 O& l9 k$ a, e$ b8 r( {9 p7 E4 U

& ], q% X8 }4 t4 ~) j  o$ g: {1 ^! j6 a. U# D/ N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 16:37 , Processed in 0.040081 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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