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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 y9 ^* C8 K  g: n3 w2 Q
6 g3 L/ S% @! N& }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 H0 p# j- }, V
#include <unistd.h>
! f' V  }: P4 F: o: I- r#include <sys/mman.h>1 T  ]  n; u; P2 b) e# C
#include <sys/types.h>2 U) n4 \4 A4 Z  D
#include <fcntl.h>
: K: u% P: |" M: h' }8 B. h; M
#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 P/ o  n# y' g

, ~, P# V% c" j! c9 \. utypedef struct
% X. A4 w( O+ |# k% m4 s{
2 W. z& B# B/ s9 |3 `9 r. o        unsigned int a;
* ~" f  d  s& S. t5 x4 Q        unsigned int b;. @( U, t" J/ a8 h. O% F( ]. w
        unsigned int packet_cout;2 B6 v( |; n* O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- }" J. T, B( @4 V: y8 K9 e. s9 k3 A. M3 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' s# W6 @0 O& b9 G2 \1 M( @unsigned int count_copy = 0;# o/ U) Q& \! w- y& a
! `/ v* O/ n% h! J& ]  @

4 y( R' d) C8 bint main()
1 x% T7 T' b* c/ W/ d( N% ~" D# {3 `) K{
; f+ m2 G# g3 E$ h. d1 c  {2 v9 I        pRX_MSG_PROTOCOL pshreRAM = NULL;" E* V8 d9 M( h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. ~7 x5 ^# ~/ F$ m8 }* S$ n% `+ I7 P
        while(1)/ ^0 f/ ~' W6 D4 h' C
        {2 K2 s/ z* h/ n/ S  X
                read_MSG_buffer(pshreRAM);
7 ]/ \& [6 L  _4 P% f0 P, z        }                / g, Y: t: @& R& A, P% }8 L
}$ z+ V9 z" s; ~/ g8 w, {1 R

" Z8 l( ^* a0 F! D% jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): k9 c! T, j+ W5 E, R2 X. J
{
3 r+ Q4 \# Y0 V2 w, q1 X7 @; `( z& ~        RX_MSG_PROTOCOL buf;5 d% \+ V4 f; W  t
        , Z5 h- Z4 \/ p. w2 i
        buf.a = pshreRAM->a;1 X& Q* e# x! `& K  B
        buf.b = pshreRAM->b;
$ P9 Z8 T: }8 s* n0 Z0 j        buf.packet_cout = pshreRAM->packet_cout;
- N0 J. E" g: E$ C8 C$ G        ( J8 v: s- E+ c9 n
        if(buf.packet_cout != count_copy)
' }" c( Y/ t" a! T+ S# L& M2 I        {9 p* d8 ?  I# H% B+ g9 z
                printf("a is %d\n", buf.a);1 ?3 y( b4 A+ P' z/ R# A
                printf("b is %d\n", buf.b);' ]: g( q- t1 V
                printf("count is %d\n", buf.packet_cout);
" Q: ]* W4 b0 Q9 o                count_copy = buf.packet_cout;
( c; U4 m7 h8 b, L$ ]. G# x        }# U& B7 {% L4 _# i3 @1 u; A, X% ?
        else1 |9 f; C" n) I8 `4 ]/ e
        {
" Q5 r+ R0 N1 a5 i9 s" A: N                printf("No effective message!");
0 a* A& I- p$ G1 h        }; g# Y* f! h- U' O- R1 t
}
: ?  e& i9 c5 V: i# I+ s" }  x
' u9 U2 A& m# Y" q* h% ?+ [4 ^( J2 f* x8 \( y& o, K& ?8 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 V, S. U1 P2 ~
使用下面代码,对内存使用了mmap函数后:  b3 A5 d. l( v7 A1 N2 m
#include <stdio.h>
- s- Z+ s6 S. `7 A#include <unistd.h>) H5 V% g( n& W# ?; ]# s
#include <sys/mman.h>
) F$ m) D- J; I6 _$ k  s) m#include <sys/types.h>; b8 S- I% p# z- C% D
#include <fcntl.h>
3 I4 f$ T4 m. @. h4 e7 N7 o; [" a: l$ d/ `6 N
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! l  y; t1 [) ~- o0 w#define SHAER_RAM_SIZE         (0x20000)   ' X6 g' \/ r6 @6 p" J; a

0 l2 e7 B# |: ?0 x: l- Btypedef struct9 n. W$ y% [+ y* B6 ^9 ]
{: K, _" K  c' w7 h6 s% W
        unsigned int a;/ q* R9 l4 J/ E; X- k
        unsigned int b;) }9 r; y4 @1 L9 A
        unsigned int packet_cout;
% B9 h. E% {6 ~' x9 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, i9 u# g+ n- F
, d( S* k' e; Q  O$ ?' m2 u# Q; `
void read_MSG_buffer(int *baseaddr);6 d5 i8 D- i, }' Y6 K* U1 @' ~
unsigned int count_copy = 0;( `" p4 Z' {" Z- ~9 x) a. c
( L& S3 q8 I4 j! s4 f8 \* F
int main()
; {5 }9 y! {: ^. D& m0 u{
- P( B3 [4 {! j! a& s: T0 K( h- k        int fd;
& `& w: d3 ^% b. a$ P1 o; [& z        int *mem = NULL;$ x5 ^; v) h1 \2 N- D

* H, e3 `& r- @/ a% _/ t4 R  _        if((fd = open("/dev/mem", O_RDWR)) <0)" J& Q" w; i- k+ L) ?) Y6 m* c5 ?
        {. b+ _, u6 v2 w2 k9 h4 A( k6 ?
                perror("open error");
, b9 \$ B( k% I' N: K+ Z/ r                return -1;& g" Z7 m( O! [0 `. p
        }$ _9 Z9 @# y1 e* l5 g
        
4 E" N+ o: M; P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. |" g! A* [( J% E9 A' I; L

! j5 ~8 P/ N. B& H* g        while(1)3 j* m0 |8 p0 b% _. s" J: o
        {
, x) g6 q4 j2 V1 ~                read_MSG_buffer(mem);
2 ]) P8 I' K" I" o& M! Y+ m        }                ' f1 ^' V2 U( q9 p
}+ o% X. T' N" c6 w7 M

9 W$ B1 x& Q7 @8 K1 i3 d: }5 ?+ Vvoid read_MSG_buffer(int *baseaddr)
2 }0 y, y; o& Y( k# X* M7 K$ V{
& w. H6 z' W( A& I4 _' L, W        pRX_MSG_PROTOCOL pshreRAM = NULL;4 v9 X3 |" C! H  Y# Q$ G

$ i0 f; Y% e! y" X) z2 m        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 `1 p2 O4 i& @; t) j
. e6 R% G2 e) ?2 I        if(pshreRAM->packet_cout != count_copy)4 q0 v" C  |( i2 ~" b( g% f8 S
        {2 Z2 w3 Z* e( b1 e* d
                printf("a is %d\n", pshreRAM->a);* Q& }; v* |# S. N
                printf("b is %d\n", pshreRAM->b);
! O. g& A7 y, U- Q* M                printf("count is %d\n", pshreRAM->packet_cout);
8 E) t, R3 v) X, W                count_copy = pshreRAM->packet_cout;" p1 \6 C' N! t6 v5 ~3 t1 b
        }
2 V1 v" B. T# v0 ^        else9 w6 Z- I( ~, p$ K6 c
        {
, |1 U- V! I0 X. `                printf("No effective message!\n");
$ ?) ]% C: _4 M        }
' Z9 F& }* o5 `# O3 S. ^( o, A}
) O3 T( }3 E$ o1 a& g) `! |2 O$ t  F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& G- n0 R. q& m* E# a2 H( ~

9 d& [# d/ Z; u' I0 i. b0 y
: x3 P% ^& @3 Z( R+ U
9 x8 R8 B5 ~8 e% P; O" w$ D2 L5 ]( A
1 w: c/ J6 A5 n% K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 03:56 , Processed in 0.053541 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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