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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ]6 l. o; H; x& Y2 z9 m. p( U! x$ X6 ?' z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. S2 O5 Q3 \. d5 I
#include <unistd.h>' R: B) B; t/ ~/ N" |# P% V2 D
#include <sys/mman.h>
9 Z5 r# [! U1 s4 l: p- k#include <sys/types.h>3 Q) i) m! N7 O7 f0 D" o3 v
#include <fcntl.h>
' J% u+ f7 m' Z  r( [/ o; G6 ?+ F0 u; O8 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( u" k: R0 `9 q0 e' S$ }6 U7 W
: Y: N. x$ j4 E! A6 ?typedef struct
& K8 y9 X; j7 w& r9 ~# ^. e{
& _* J+ \, _7 [. Z6 H0 f1 ?        unsigned int a;
" r" b; F8 @% ~7 g' d1 Z4 Z        unsigned int b;# D6 r* U9 g! [$ z6 a' g% G
        unsigned int packet_cout;+ w# m% ?$ @2 L5 X$ S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ n  l0 B; r0 E

) K; Z2 l* r' G9 h/ E0 fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) j# F7 e3 ?( funsigned int count_copy = 0;
; `0 {) u! b" e3 l2 q: z! a( }+ N
3 T3 U$ {0 _2 q% G; \  {# @
int main()% T2 R- }* l" ^& C+ G3 M7 f
{
& y# ^- ?! G, P, T        pRX_MSG_PROTOCOL pshreRAM = NULL;5 `2 J- o9 G+ p7 S5 n3 ^. G
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( ~$ ]; |2 t; g& B0 g4 l: W8 g

, F6 h# A$ p( X* M& [: W# [        while(1)9 J% c& F( I- X" Q. [4 ?9 a# Y0 B
        {
7 j4 k  Y( [# L8 F4 o7 e                read_MSG_buffer(pshreRAM);+ k+ u1 E5 {5 F
        }                4 T( U8 w! J% T& V
}. S7 Y4 D# ?4 p/ U& r! c6 ]
9 X4 n) w% q2 ?9 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 O/ C5 X3 b$ n4 a5 b( a. E, c
{
- h5 S/ D6 m0 }8 d' n6 O        RX_MSG_PROTOCOL buf;+ Y: R6 ^! t) W  f! L- d
        
( c- Z) m; v' r2 a* H! w* E        buf.a = pshreRAM->a;
: \8 S6 ?$ l( O7 G        buf.b = pshreRAM->b;
) n1 R7 z; g$ F        buf.packet_cout = pshreRAM->packet_cout;% ~9 a5 E2 s$ w2 S# @$ J+ \( ^
        
% @* k% |+ `( Z) x        if(buf.packet_cout != count_copy)
: F5 e" a5 d/ X- m% I- Y$ P6 k/ M        {
* Q' ^" N0 |9 }. e  M  O; I+ e                printf("a is %d\n", buf.a);8 Z$ w$ i3 c% [) {
                printf("b is %d\n", buf.b);1 w$ n6 i6 h- l. B
                printf("count is %d\n", buf.packet_cout);
7 V& ?( C7 |% S6 E" I                count_copy = buf.packet_cout;
- S9 o% @7 H& [; |0 [        }1 o1 o6 r- K' t3 Y: L
        else
7 W* `, ~( H' b+ d* B- v        {
# N' p9 W3 a, E* n# T) w6 g- q) d& N                printf("No effective message!");
6 p5 k3 V! j) \        }
: t0 J  D+ n/ x  Y}- ]! O' q9 [+ M

  q2 @/ o" X& Q4 `  `& f# X3 u! l& _4 N$ p# B- g! G/ W5 L) d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ Y, S4 v( k5 b: ~* \! v' @使用下面代码,对内存使用了mmap函数后:2 K( Z7 A9 F, s, E1 c
#include <stdio.h>
7 ~( b! z# W/ `, _#include <unistd.h>* u" N& s) H& U5 ^2 g8 j8 G
#include <sys/mman.h>
4 d0 B% _3 M$ z6 j0 n& t#include <sys/types.h>
6 O1 H1 q+ k" ~! }5 ]3 S- w$ o#include <fcntl.h>
, F* |% ?: r/ Z% k5 B
7 o; u) l3 ^; ?9 S, J#define SHAER_RAM_BASE_ADDR    (0x80000000)
" e- W% l6 H2 t4 w: T( u' \#define SHAER_RAM_SIZE         (0x20000)   
) ^( T/ l& R/ U  g% V9 B
8 F# N' H5 b# I3 V, r; q9 Xtypedef struct/ B$ u) x8 x$ X: Y; D' M5 E# i+ C6 N
{3 g8 Q/ `0 }- ^' T- \
        unsigned int a;- y4 o. A! ~) T* ?* |$ m
        unsigned int b;5 X- G7 i0 s3 b$ M% z
        unsigned int packet_cout;7 _( D% N8 Z8 ~8 b) E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 y1 J- v' v1 l5 @+ S& T& n

7 [, e$ r, \& d7 C6 gvoid read_MSG_buffer(int *baseaddr);
- |* y$ u, t+ y# o- S' N4 nunsigned int count_copy = 0;; R: E* M5 U1 \) K
& D" a+ o% z: n0 c0 }  b) Z
int main()
3 `$ m* G' u3 h{5 T) i" k8 w, p4 l
        int fd;8 v$ T- Y/ Q2 R  J; p9 _- H3 v# F
        int *mem = NULL;5 B& ~0 Z! j- Z4 H( U
& ?" w. Y" K. A* _. K
        if((fd = open("/dev/mem", O_RDWR)) <0)
' y4 P: D' N( V( w8 V' [        {( m7 f0 A, |3 I# X
                perror("open error");
: u3 s) X2 P( I# r' I* N/ t: W6 K3 O                return -1;
+ D' }7 g7 n9 |! C( B/ r& X7 X0 P        }, j3 y5 c& F+ s1 d
        
: A" J! X( ~) e6 o! _1 R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 J+ Q  q! X# T# {1 k( g* g
' M- v( @: A, I1 C! O
        while(1)
/ J, K# v' t; E% A        {
8 Y2 r5 Q% u% X. H2 k8 o2 H) t! b1 R                read_MSG_buffer(mem);. u6 y) X+ e) P( R) S
        }               
+ U" O& \# x7 N  n}4 n. l) _1 T1 s0 S( P6 H( W

9 u& G3 L4 d, j$ a( X' t$ z. bvoid read_MSG_buffer(int *baseaddr)- B8 X- Q, g) _, D8 y
{& {6 g( Q+ s4 J5 f+ D4 c9 @/ ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 T9 e$ s( }, f; E; ?$ [/ R4 d  @; ?' h5 }7 j1 {3 Y5 }& {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 y! }( D) H: q+ B4 w; Q: u& G" P; Y) [
; ~# a4 e7 v! a& G7 n! Y( H( w0 E& [( Y        if(pshreRAM->packet_cout != count_copy)
0 C; M' r4 t  A        {7 P2 `$ v( ]  J2 k0 y
                printf("a is %d\n", pshreRAM->a);2 o" D; b2 J8 Q$ u4 E. E/ F. \  \
                printf("b is %d\n", pshreRAM->b);
) Y" h) i* N9 ]( Q$ C                printf("count is %d\n", pshreRAM->packet_cout);) W* d" {/ `8 ]( m7 V5 d% Z+ e
                count_copy = pshreRAM->packet_cout;9 I$ A9 W) f# U, V% a8 F5 [
        }1 @9 d+ T/ m2 f
        else
2 t. G6 }9 ?8 y% ~% n4 D        {
# J4 j8 \- }* H0 L                printf("No effective message!\n");
0 p3 b& C& @. }! ~# D- b        }  i* I9 Q4 G& Q
}: \* E/ ~- C# d. O" r

  i9 L; d  `% V5 T9 ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  k9 e4 D  h. m4 @2 L& q3 |, O+ r" z+ I' h9 s

- b0 f% z* ~- V4 v5 e" z
0 y) e' m2 n0 _5 s2 C3 x( Q- H
9 L% N( }- D: t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 10:24 , Processed in 0.040085 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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