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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' `$ M7 s" v. ^$ S5 D+ w0 @' e) ^  A* ?- e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 l9 X3 m: @, h4 q% G2 G- h
#include <unistd.h>$ M5 B4 P. K7 ~& V2 s7 b2 O2 n
#include <sys/mman.h>6 Q8 D# ~4 i* E9 l0 ~# q
#include <sys/types.h>
, l6 z: z. f) _' A% W6 E  x4 n#include <fcntl.h>7 t! X! h/ z3 D! H; P# M$ A

" T% n8 ~" n8 q7 o#define SHAER_RAM_BASE_ADDR    (0x80000000)   " h0 ]) D* [, z/ j( b; [/ b$ x

( h5 d: [/ W; s1 x+ Btypedef struct: x& Y& S6 Q- E& E* Y3 s' @" R
{3 V* Y5 w; A) j) N% G
        unsigned int a;) _; B5 t+ ?. ]
        unsigned int b;. u8 Z' r9 `( L, x9 f- H' W
        unsigned int packet_cout;8 W# Q& H! v8 K: t) V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 f& C* V1 a/ O; q7 S% Z. F" s- d  n7 ]: q& L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" M, q  z0 f( k- F
unsigned int count_copy = 0;
# Q0 Q' t5 L6 c0 i/ L; y
" E' a  q2 Q+ G' e
/ _( M, E9 ]3 L/ t/ v( Gint main()
( N7 z2 ~! F. L7 n$ U+ y: x{  d+ o. G# q) l
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 J0 d, ]/ J+ ^, K6 `7 ^$ q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  O# L, E; H7 f3 ?8 d6 l# l% x6 t0 F( T" m0 ]
        while(1)
3 ^9 w  |" r3 ~" L% g  T        {* G, e  F0 W* \9 }4 y( A+ R$ X
                read_MSG_buffer(pshreRAM);
2 e0 ]) N- M, m1 p8 @        }                4 Q1 T* Y+ b" e5 m% [1 Y0 h+ X9 N  o
}" m5 O' _8 C* K' U  X! G

9 X1 c% h/ U+ m1 C8 K3 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' a. D2 I8 m; W. z$ L{
/ S( ?0 o8 T2 H% \        RX_MSG_PROTOCOL buf;
2 J  v! B) u( V        
* X3 |2 D5 y( ^& S. p        buf.a = pshreRAM->a;
  m, z5 g, ?4 p        buf.b = pshreRAM->b;7 Z* }2 c' u9 ^* J& N; U
        buf.packet_cout = pshreRAM->packet_cout;
, F$ w% f! q" S, H' T* t5 H; @1 T        
8 a; \! A5 [  A/ f        if(buf.packet_cout != count_copy); l7 a) s; a+ o# t+ N0 D
        {4 k  b% @1 e2 F( G( q, r
                printf("a is %d\n", buf.a);
& ?2 {( s8 {# c5 |( ^& s; I5 m  n                printf("b is %d\n", buf.b);, B6 l& F4 f' }9 r( |& A
                printf("count is %d\n", buf.packet_cout);
5 B' D7 C3 J1 s* O! m9 G. |/ M                count_copy = buf.packet_cout;
6 v: i0 }* n. _: Q+ J        }4 h; A. S7 U) p: N2 V- I
        else+ n3 G2 T3 l4 Q' l- `: f; p
        {
5 d7 H9 w4 n8 J- Y: |" r/ h                printf("No effective message!");/ x6 K, \  ]! @) F
        }) {$ f% G" I% ]) B& P
}
. ~+ r: \0 q  O# v7 l  i. U6 R$ X5 B: }. S, [! ]

4 `$ Q8 C& U# a- m- x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, i, t8 P1 N; }! r' @8 k
使用下面代码,对内存使用了mmap函数后:
3 \- O- F% q% E: W  T2 O6 I#include <stdio.h>
) C% J0 k1 x: |) P#include <unistd.h>
/ G8 }. W6 U% D8 L; o& ?2 r#include <sys/mman.h>
5 I0 J+ V6 l% w3 r% z, S" y4 u#include <sys/types.h>" @, y2 i6 ^* [1 ^4 q# N$ ]. i9 ^
#include <fcntl.h>, w7 h& s( Q( \$ ^4 j
7 R* s" K8 v# G; @* m" q, W
#define SHAER_RAM_BASE_ADDR    (0x80000000)
' l  L. S% b4 z9 i/ B#define SHAER_RAM_SIZE         (0x20000)   " P6 ^+ D" \! p7 z

) |  a* h) _: X4 l8 [2 S$ Qtypedef struct
8 g7 [  L) N+ ]2 ^( H{
8 Y5 c' E0 D7 h6 O1 _$ r        unsigned int a;( b- e, }; C& ]1 }
        unsigned int b;
! `4 k! i" B& Y/ w2 c8 [' I        unsigned int packet_cout;
$ c/ i. ~( I" j- Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' D. {* O, G' T' c0 G4 J

8 V/ C3 ?' L% kvoid read_MSG_buffer(int *baseaddr);
0 D& ^# f5 m3 Q- vunsigned int count_copy = 0;
. `3 K2 t: ]( i; Q/ c! @. |% t  D3 n3 [6 m; j" w
int main(): m* N$ h6 y1 h9 L5 d5 F! w0 ~. c. _
{* {8 A5 A0 g+ M! N) W
        int fd;
7 M( o* B" d  s, H+ _/ p5 x        int *mem = NULL;
: c- T' [( ]1 T* ]% L/ k5 ?& s  D/ z# I, i" }9 L! A
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ l0 r: g  _( Q5 a( I' C        {
! A  F. u& o- c                perror("open error");: ~! k$ o# o5 ^: c5 z# O" d
                return -1;" ~( h3 ^/ t) z* x" k. ^9 f# @  g
        }4 s% b0 f' x8 k) X6 _. O1 @
        
3 m: o: z; K; [" K4 K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: Y  Q7 H% U0 G: W* t
/ l1 i9 s' C" y1 ~& ^' ?# A, @2 W        while(1)) d  W4 b6 @9 q" X! x8 A
        {
4 L; W7 c# z$ y                read_MSG_buffer(mem);$ l% l- I4 O8 V5 S
        }               
7 Y" c9 J6 Q3 q7 T' [2 P) c}) \  p/ V% ~2 B9 {* ~) A

0 T2 k1 `+ ~8 D, G/ F1 f* O, Uvoid read_MSG_buffer(int *baseaddr)
* u# Y3 u. [9 x6 y- m0 B{7 v' |* L) g* ~# G& f+ H+ J; |
        pRX_MSG_PROTOCOL pshreRAM = NULL;' @, |' p$ T$ _- U7 e! [2 X

8 u* k; d9 W2 ]5 k. X; @* o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 y4 P( P0 M! q8 l; _

8 Z" o/ [. h1 V# ^& e9 `2 Z* z1 M        if(pshreRAM->packet_cout != count_copy)
4 s- l  E+ `" s2 F4 r5 I        {/ ]1 v) w$ f) X" O* U9 U/ n# [' _
                printf("a is %d\n", pshreRAM->a);1 ]: X, s$ u  e
                printf("b is %d\n", pshreRAM->b);2 g" a9 P5 y: r; l- W' W' ^
                printf("count is %d\n", pshreRAM->packet_cout);) {( S) u7 `/ J1 e, I6 |
                count_copy = pshreRAM->packet_cout;
; ~, H* e. ?$ S8 F- n7 ~        }4 p2 V# E" {: H7 ^3 ?5 r, s. ~
        else  q. g4 T3 z0 j+ \5 E( b9 T
        {
) K& Y& c% n4 M$ [+ D                printf("No effective message!\n");
  |+ j8 `9 E, M, [9 d8 m        }
! {( q: x6 U9 N- t" B& M# n}
0 x& G4 d7 S/ Q" ~
" y2 [5 K0 E0 Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* \* V! l1 A( X: W* e

9 U# C8 V: V: q; J
3 a9 h4 x" N$ i2 ?. G+ r
3 J1 Y6 ^. g1 h1 Q8 Z2 u. f& U: t3 j8 _, P( n3 q* I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 10:27 , Processed in 0.039665 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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