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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! W: Q0 M' L; @% n

4 |7 k' O+ s. @9 TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ n0 K% ^3 S6 k: W#include <unistd.h>
$ [  X, t6 W# k#include <sys/mman.h>$ s1 G' y6 t" h2 r$ N  V6 R" r( k
#include <sys/types.h>
" [$ P! q& C8 _#include <fcntl.h>9 O6 c2 z) ?7 M9 m" w2 F3 [
# s' ?( ~7 `5 q, N
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) ?! t( b' X: |0 y1 D

% m9 p$ {/ p6 d! P+ Z) k  `7 ftypedef struct
, `. e, y; D" G  O) ?' |{/ ^7 i4 \4 g# a. G1 V9 q
        unsigned int a;! y0 C. ?1 d  a7 }8 r: f; d6 @
        unsigned int b;
8 V3 r/ R/ W) J4 M$ F9 Q+ f" n        unsigned int packet_cout;
# u  i- m- W  d7 \! {1 C9 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 `) x" d6 R; X

8 G1 q$ x$ I, r/ K0 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) l4 V6 w1 k3 a6 L$ X; p9 n
unsigned int count_copy = 0;5 p& {5 Y# Q$ E- K% V
4 C, y' N  R$ t
5 O1 l. E2 Y& u9 X) S5 a
int main()
$ h5 |0 O2 @! _$ S{
9 b2 D: _, t) t  ?# K8 J3 A        pRX_MSG_PROTOCOL pshreRAM = NULL;
( m8 U1 ~! |; G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  L' }* V& s& @' L+ J& L; R% q4 Y. q- `, @. s
        while(1)% @# x1 C" l6 _) i5 m
        {
. x, p" p3 _7 l2 |                read_MSG_buffer(pshreRAM);
( m9 r0 f  m% z0 m        }               
4 N% n# e* Q& A  w/ E}
2 x( d# h0 W" }% x) v! N
  i) S& ^4 m1 ]$ G% n8 j/ J, ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- e1 [0 M9 z7 X9 i' i; H{
' }8 E5 c! L3 K        RX_MSG_PROTOCOL buf;
) b* s2 W) v1 x% E. H; U        
" b4 r% q9 Q# C# q8 z# Y        buf.a = pshreRAM->a;
, X  I4 F5 x! p2 ~! R        buf.b = pshreRAM->b;
8 v1 C! d: O$ K2 E5 |) P* |8 V& C        buf.packet_cout = pshreRAM->packet_cout;$ v( P. }: g% ?9 C  h5 j0 @
        5 ^# s" M8 x$ \2 I
        if(buf.packet_cout != count_copy)
. s4 p8 \& e5 A( ~. v. N% ~        {
* K/ f$ x, B/ b% u: v7 ?                printf("a is %d\n", buf.a);
" h$ d4 e3 L8 h8 U5 D0 h                printf("b is %d\n", buf.b);0 F, f7 \) w$ z# p/ s% b
                printf("count is %d\n", buf.packet_cout);
* e, A' n, g$ x; I7 F                count_copy = buf.packet_cout;
% o9 m( N2 Z) y3 a: h        }! J/ I( b! z! H
        else
& x& {; s1 z: @3 P& {        {
- F! j9 M5 i- F( L7 Y0 m                printf("No effective message!");. ?8 O1 T" {0 c4 q
        }
# C( J9 U* H/ l& W% y}
- S3 Q, B8 `3 z' q' R' X7 ~2 u& }6 ]8 Z$ s8 ^
7 q6 ~5 B% a; l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 o5 B8 r: O9 ?) h, L9 [4 t$ z
使用下面代码,对内存使用了mmap函数后:* i8 @  W# a3 R* u+ o
#include <stdio.h>4 b& i5 q2 m7 h7 f+ v, Q( W  C: R/ n
#include <unistd.h>
5 ^8 m  @# o; R& ^4 ]: c/ m#include <sys/mman.h>
% D  G4 e! [. a3 c% I; H2 f#include <sys/types.h>% E5 Y- u* H7 y$ m7 _8 I$ i. @
#include <fcntl.h>
+ L' T$ Y$ D# S, h' p
$ _3 H9 z4 y, l* I" V: s#define SHAER_RAM_BASE_ADDR    (0x80000000)
% H9 z9 f; D" C4 L5 {4 C#define SHAER_RAM_SIZE         (0x20000)   
2 {* {9 Q" [( x" v+ S) |. M" R4 s4 H( x5 r2 K+ V$ [
typedef struct4 z0 W) u- F: |6 q" g
{& e* j$ m; v, w- ~
        unsigned int a;5 T9 ~: l2 H8 D! p
        unsigned int b;; t- }* _( K3 A* a
        unsigned int packet_cout;$ R4 @) K# \' o2 o, j0 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 R6 L7 g8 D% f9 k7 K3 s" \
% |/ K+ F  `. p2 b5 ^& ^5 \: }void read_MSG_buffer(int *baseaddr);
- a, H- Y' g4 w7 m$ z( H: }' @unsigned int count_copy = 0;. y. z  s: I! O" K8 L- N1 ^& c8 a

/ L* y2 M5 D$ O* M3 L3 Jint main()
8 d) X# O! S4 P* V( T) V4 @{
+ w. C% r+ R' y6 @8 z9 Y7 g        int fd;5 O$ a: A0 p# A% u/ T; q4 U( E
        int *mem = NULL;3 [6 y4 N" i4 D/ o  P9 T
% \# H$ C- k" }) j$ P: Y: M
        if((fd = open("/dev/mem", O_RDWR)) <0)! h7 J; ]$ x' a8 ~* \
        {4 D  b- m1 D6 t% o- r- n
                perror("open error");
' b9 k  `! J4 D/ r+ C+ Z4 M% U                return -1;
9 l. I4 e; K0 N( c  ?        }. P9 w% X8 @$ t/ Z  }5 h
        % b0 J3 m8 Z' r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 T( C* V: M$ A' }) w* F4 i
: D7 q0 d* g& {1 T# b7 a' x        while(1)
2 j! ^6 L8 g* c/ t/ S: B        {
& N$ b, u3 E' h% @  ~6 Q/ Q                read_MSG_buffer(mem);- ~" D  F) I; J  C  l
        }                7 J1 Y! O( I9 ^6 q
}
, o( b4 ^6 X% O4 j
2 Q) V2 f( v9 E4 G8 ]void read_MSG_buffer(int *baseaddr): _1 q  b6 O- t
{: h& R# o4 `9 F4 B; g" `$ Z  S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ @, w5 W* b" Z& M) h; H, p
; E2 z: J8 W& |# l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ X& `" x8 ?7 B% i# W$ X' a: Z# c. m2 r( y; o% w8 M
        if(pshreRAM->packet_cout != count_copy)
0 e9 w$ R) U& J% ?7 a) i        {
2 a! Y; Z* ?% f& ]# M% @                printf("a is %d\n", pshreRAM->a);
" O4 j5 n' l3 O. }+ U" d% G" U/ a                printf("b is %d\n", pshreRAM->b);
) E6 U; Q% v0 \" M8 }3 o                printf("count is %d\n", pshreRAM->packet_cout);
, [/ u1 D7 @- G                count_copy = pshreRAM->packet_cout;
* R6 }1 R" s- e: z' h        }' r' f; }/ E( o9 d$ t& D# R, C
        else, n2 k& T/ }# i+ p& N
        {$ G% {  b$ B/ S, S
                printf("No effective message!\n");9 ]% N; f" m. V- F. z3 z
        }
3 ?& F2 S, s" s6 x( s( c. J}
9 }# J& U6 S, f/ D+ ^# F- u$ Y3 y# D" n) n6 T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 B3 s4 p  G. b/ ?0 ~& i9 G# z3 B8 n0 E
3 o, @) D% T  V4 ~- ~: Q7 [/ I+ n. m

4 C$ C# T5 L4 \+ Q
9 x& K/ a( q+ O/ N$ z% t8 @  m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 20:29 , Processed in 0.040653 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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