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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: N* I8 x9 z; C3 F3 r; \
+ [# s& Z, X- t6 d* P/ j( g! C0 fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 M0 H& H! X) r( M; b, d#include <unistd.h>5 [' V/ }! e( R7 t& c4 {7 d- L1 m
#include <sys/mman.h>
( _9 v% o# P. s  Q#include <sys/types.h>
" d4 S; h% u! j' ?6 H2 ]" i#include <fcntl.h>
4 s- Q* Q0 y; _8 Y+ i2 S4 l8 l5 ^$ M5 c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 b! F8 d3 T/ T3 ]& z7 t+ B" h3 L8 @5 }/ |1 K1 A- O' Y
typedef struct  g. g; a' Y+ ^1 U+ g( Y& z: _# J
{
& x# O  \; L; U1 {0 A' ~! a        unsigned int a;
) Z; F* w* a3 t- v0 L2 f- M        unsigned int b;/ y& F: B& E: B" x9 G% i. F
        unsigned int packet_cout;) H% `/ o. ]4 B- J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 L: ]4 p8 F# l. o; {+ C

5 H! u) O' F# C: G+ d/ b( hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 T) [# Q1 \% l" H$ G% [$ |, g' X
unsigned int count_copy = 0;
' M% @( J0 A4 p$ e: W/ T* P  e$ `* p$ R' t  d  p. g
' T, G0 A) m6 R3 ^, V
int main()
+ B+ i4 X; D! _) m' j/ L$ r$ C{
9 a, ~) a% ~2 H! v5 O% h. K+ t5 |9 O        pRX_MSG_PROTOCOL pshreRAM = NULL;3 C  k" I2 U& _9 [* _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, H8 `* m/ [7 l7 K; o) o5 U6 R4 A4 a2 q
        while(1)
9 U$ h6 u" s9 n" \7 K        {5 V5 `6 X/ }7 R: C' }) x
                read_MSG_buffer(pshreRAM);
. ~: P1 r3 A0 Q" h' F) Q        }               
- L4 X6 ?1 |5 A6 c/ y2 W) m}
$ a& a- \  b0 k/ J/ A: s
7 ~0 ~  z& n1 M! gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. W0 s; w' n0 n) m8 _1 O8 X{5 I# \. L( m, B, ^! z3 m
        RX_MSG_PROTOCOL buf;% F8 l7 f2 t' m$ A. r' v( f: q
        8 M7 L" ]& }, E( s) B* H  t
        buf.a = pshreRAM->a;
3 K3 w& }" c! N& i! g- C, l        buf.b = pshreRAM->b;, [# y  X9 C' T0 S% i
        buf.packet_cout = pshreRAM->packet_cout;
+ R, {) Z& P- J$ W  @        9 N5 O4 r) s' ]' K# [  e
        if(buf.packet_cout != count_copy)
1 G0 w% e) o8 v8 {- F        {
  M$ k% f* M7 n; v# ~) X4 d7 n                printf("a is %d\n", buf.a);& r$ N- R7 |# m  q, b2 ^( X
                printf("b is %d\n", buf.b);! V5 t. ?9 |1 j/ Q$ ]- U
                printf("count is %d\n", buf.packet_cout);( |/ }7 @  r" W) f" R6 I' I0 N
                count_copy = buf.packet_cout;/ j, `/ `3 a# Y5 @9 I. w' u
        }
: q- ^+ N  @- I0 g' g5 H        else
# K# Z+ v& I# v9 p9 s        {
7 l. U" e9 N: F0 x4 y                printf("No effective message!");! d9 b0 P# w8 X  F$ E$ ~
        }
3 c6 ^7 l& e3 J}2 K' ]. G' h" w" x# B+ b" A
0 m- N6 y$ y! T& w) w, p7 L3 k

! ^9 T: }% |- W) t9 u9 p3 E; V但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 O+ l0 w. B9 P4 T/ J
使用下面代码,对内存使用了mmap函数后:
$ y+ D& ~$ \+ O/ {7 }#include <stdio.h>
/ P3 k8 _/ K9 N, t- c#include <unistd.h>
* H6 j; v$ V/ v/ t2 d7 j#include <sys/mman.h>
3 z# B1 O: \. u3 W+ B. R+ M" C#include <sys/types.h>9 A6 E4 z; b( Z$ o' W! R( `# H9 C
#include <fcntl.h>
  U8 S' J. q& a6 U3 x; N" L: D# D& s: e' S9 r5 \
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 p$ j% x( k2 `#define SHAER_RAM_SIZE         (0x20000)   - Q% h& ?: o5 o( m- S2 l

. a  @0 L0 W) E$ W/ O+ F! otypedef struct
! j; V" J' c  c{
, ^* c  ?7 D: B' q0 G( l        unsigned int a;
  O6 D, t  b1 i! [0 P' ~! Z! A. }) I, i        unsigned int b;
3 p2 i) J# t- o: T6 E! B. I8 U- D: n        unsigned int packet_cout;1 Y+ H/ a( \+ {4 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- X6 \+ X) x* Z/ J9 ~; g# l- [- l2 X" T- m
void read_MSG_buffer(int *baseaddr);. y" |: {. g/ g, s  {
unsigned int count_copy = 0;6 k( f- i9 D9 \0 ^& b/ y
, Z8 l  K( f% i9 L7 i/ z
int main()! K( `! b6 T0 O0 q: R+ X6 h% W( D, z
{
3 |$ X$ H3 n  X1 t. K* J        int fd;. y4 F9 |+ `) s# ^6 S" }# Z
        int *mem = NULL;
1 q8 J% w/ V, s6 W" Y5 H
/ n7 j8 e7 _- b        if((fd = open("/dev/mem", O_RDWR)) <0)" s8 z2 u! U' w0 B* J1 w. o
        {
% k5 o5 g$ J) t& D! ]0 s# h! c8 ~; M                perror("open error");! g; H4 {6 x7 ?+ c5 y8 K
                return -1;' v6 i! P( h! L. W
        }4 e' S5 X( K: j( W4 {
        
0 d9 p# `+ c# R) H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 Z' k& ]' C, Q* f0 P0 n- i3 I
0 v8 U$ W; Q  R( ~6 H
        while(1)
8 F% V* |' N9 a8 x9 I9 b5 U9 E        {# V$ @* q6 H) F( K2 q" e$ X
                read_MSG_buffer(mem);: m$ g) j+ [$ T  Y8 v: _# ?9 s
        }               
. t& [$ J# \# \}
. K; O* t( a: [1 E5 _2 F5 O/ F: ~' _0 @  \1 A9 e+ {
void read_MSG_buffer(int *baseaddr)% _0 N/ m' K, q1 W
{# Q# c5 S0 @+ N
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 |/ D% B% v  }$ `: Z& R% P

8 }0 i6 k* [" R1 p        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! P8 j" R+ G6 x
. f7 _1 W. v4 y        if(pshreRAM->packet_cout != count_copy)
2 y; \9 p: t! e% n2 D        {% `" a! g. q/ ]* Z$ g
                printf("a is %d\n", pshreRAM->a);8 d4 |' ]8 y* U) {$ T: k
                printf("b is %d\n", pshreRAM->b);- A* E# J9 `; Z) t" B
                printf("count is %d\n", pshreRAM->packet_cout);" L. ~+ l6 ^) V  n, c
                count_copy = pshreRAM->packet_cout;
) ^& v5 n4 L$ e0 B) g; |        }
) s5 u* s, k( _, Q% h' a8 k        else$ e/ d: q5 C, k- z
        {, L5 \1 z8 D( b
                printf("No effective message!\n");: o- Y$ R8 b- }3 q8 Q. e' E
        }
# @3 E' h" G4 l( C}
/ g/ G* o8 A* T7 \0 }) L, N& r) m) y9 C  U  i2 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' I0 K; p- a' f) @
+ _: H& N2 K! R+ _$ j7 i0 }/ K9 a$ b8 }

4 t3 ]- F6 }# |+ [; p% }( b# A* \5 e3 F( c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 21:36 , Processed in 0.041633 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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