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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 q* ?6 E/ p! V# K! s$ M' v" O; s. B* [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 u# U: [! I3 \6 X
#include <unistd.h>9 ~+ R! d/ _- B5 b& ?* N2 f  r
#include <sys/mman.h>2 }6 B5 h! f2 _4 {( i# w
#include <sys/types.h>
. P; g8 P! ~; T% O* C3 S6 }#include <fcntl.h>
, s) h- z; p1 l
" f- Y/ P3 R4 S9 ?7 f/ h( K#define SHAER_RAM_BASE_ADDR    (0x80000000)   . }' R. c* Y' M

( m% t0 s- A* Wtypedef struct$ w1 d1 L' t4 L+ g2 I, F
{
8 R) t. T0 N0 ~( |! _        unsigned int a;
1 s; J. A6 D% |6 X! m# }% D        unsigned int b;( i0 p  P0 b& x& N1 F5 y+ @: u
        unsigned int packet_cout;
' W; [' C/ M6 ?3 D) H5 V/ {$ [* D$ T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 O" Z7 v$ Q6 ~0 H+ k
7 }9 k9 l. P# x/ J7 e2 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; I" |* t$ M9 ~7 w; V; i9 |: R
unsigned int count_copy = 0;
) v6 o* {0 `6 D% M% w% @
3 k: n! V2 P* [0 [( j* _5 m
5 k; T8 Y0 h3 [2 S4 ~int main()# [# F% u) ]# k, _. H7 p
{0 m1 E) M/ M2 A  K6 p! Y/ a
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 \7 n) q/ ~- x1 a1 U3 o: Z& _4 s
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 M6 {4 Y0 t0 Z5 P7 H
# i. k% c1 l! N        while(1)
! v" Y2 a4 P; x. o/ b        {: }* x, I5 q% v$ `& f2 ~- F& a
                read_MSG_buffer(pshreRAM);& @+ `  x$ M& a7 @; C6 E
        }               
- Z: H$ d7 s! X' o& p}, ?$ y: H1 S3 k' Q1 U
0 G6 R  X1 l, p# d3 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# F7 b) [7 v( ~4 ~, V( ?
{9 `  ?& r: X; x2 ?  S) t, _. Y
        RX_MSG_PROTOCOL buf;
# {: M" b: [  I# F' g        
# o. z" W  D. r- G2 ^2 r+ b* R" w9 \        buf.a = pshreRAM->a;
9 L" j3 g+ w0 ^* q/ n        buf.b = pshreRAM->b;
) r/ f0 R4 ?) _* J6 i        buf.packet_cout = pshreRAM->packet_cout;. h! P% u. X& M; O, z* {$ l
        
: I$ |) [+ [  g  U! H        if(buf.packet_cout != count_copy)* }5 @( p6 p4 M
        {
% D4 @2 F6 {' P9 p9 J                printf("a is %d\n", buf.a);+ y( l9 [' S( l4 @' e
                printf("b is %d\n", buf.b);
& G1 s+ L* `( `7 [- R                printf("count is %d\n", buf.packet_cout);5 M- x/ x! {! l' R! x! G
                count_copy = buf.packet_cout;
& u9 F& v2 Q. b5 }  P9 W6 h        }
; f! }# _/ t3 S- b        else7 m$ o& C3 X# w" h9 }
        {
! _' p9 v& J) P' n                printf("No effective message!");" @( [7 Y- v1 S. f, v5 y/ o. Q( G
        }" Z6 }$ }5 o, ^' V: J! Y$ g
}1 J, }/ B2 ?. s, s& ^% k6 k

" ?9 R$ |$ N+ X& r7 I  ^5 B
7 l. q7 Y' E2 ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  J0 e. T1 ~( ]& q  L使用下面代码,对内存使用了mmap函数后:
; N3 O' ^8 X% s3 C#include <stdio.h>$ W% L( F% j- Q* H8 S
#include <unistd.h>
9 t# x4 c9 M8 m8 n' S0 Y0 y( Z' X#include <sys/mman.h>
) I3 ^; e  N2 z#include <sys/types.h>8 p/ X" a& `7 T6 s8 h6 D% r, W8 u# K
#include <fcntl.h>
6 Y) O7 S. A2 x' B" @
# b( |; a  c! ?6 l  x5 A0 c#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 f8 m- B& U0 P7 ?" F1 ?& e' L; s#define SHAER_RAM_SIZE         (0x20000)   ) V: I2 c! h# h# Z9 Q: v

# ~4 i7 u# Z2 |) `! J6 ?' D0 Etypedef struct
& h( R5 I( }1 [{
9 j% d4 Y% M  Y+ [9 G" L) D. r        unsigned int a;
  U# Y1 ?  G) i0 r  _. ?# V        unsigned int b;4 z7 P* A$ C; b2 E
        unsigned int packet_cout;
& e- T6 p+ L( q5 W$ x# M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ D/ {  r: a, D- i1 X

. T2 D$ ^  x6 rvoid read_MSG_buffer(int *baseaddr);4 R  i( C* f; u; K5 d! M
unsigned int count_copy = 0;; \6 @7 ], J0 m
& |' n6 Y' ]$ M- I8 Q4 q
int main()) j) J: ~( Y+ B- ^9 N9 T
{7 E2 p1 ]7 T" ^' N' q1 x7 V
        int fd;9 {1 e! `9 I0 C; B
        int *mem = NULL;
' ]/ s3 z+ V' d1 @- Y( e, A  p1 ?6 p
        if((fd = open("/dev/mem", O_RDWR)) <0), K; {2 S0 d2 j' e
        {
0 r6 x, I: h9 d. ]9 f2 v                perror("open error");+ t2 b. q# n9 R- |& D
                return -1;8 Q% f- `6 B9 \, ^( s
        }
5 P3 m& D* W: ~8 ^) V- _  Y: _          q$ p; Y$ Y+ n, Y+ @6 \& ^, G$ h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" o. l& [+ J8 Z" V$ D7 ~1 \
! H" X5 E# g: E7 N- k( U
        while(1)
, L* K! u0 P3 \% H2 t" p6 b8 F1 g# _        {
& V1 m, ?1 j# ~: |9 Q9 G- A9 q                read_MSG_buffer(mem);6 N' s0 I% A% K1 [  N6 X6 C
        }               
3 S1 o; x9 g. N3 ~5 u}
0 R: y4 }3 J$ m5 ], U  s( `& @. F& ^# _5 k  w- p  ]* p$ s
void read_MSG_buffer(int *baseaddr)
+ L8 E# U$ Y6 n5 x5 T0 e{
% y: ?3 G) w  _& k        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 ?) m8 r4 y3 ?3 D! g$ u7 `) F- X
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* P6 L1 O  d% n  P# N& d/ W
, u( ^; m. x) a" ~3 f% m% E
        if(pshreRAM->packet_cout != count_copy)
0 V# w+ V! N5 _1 g% {: A        {
6 ]6 b6 P( `) n. W0 f% b; f% f                printf("a is %d\n", pshreRAM->a);2 @) d2 G& C: o0 C; ]6 b/ B
                printf("b is %d\n", pshreRAM->b);
8 v3 o0 a6 T( W4 u" q# W- X3 O                printf("count is %d\n", pshreRAM->packet_cout);4 o  J" D5 }4 G; k) ?) f
                count_copy = pshreRAM->packet_cout;
3 ?. {# u( O! c: m        }
" Y2 h! `6 I5 u; N" H& x( w        else
4 ~5 K) u' k( k5 }        {
1 [: F  O3 F! X! U- }8 U                printf("No effective message!\n");0 `# }) D* V$ p1 q( y
        }
0 f7 w7 i# Q. a- q7 g# K: P1 K}
' b1 c& {& x! z
& ?3 `: m% Y: _% k, R没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; `: p4 t3 N* t$ \" T4 G
1 i% e* j# K# M1 B% d' L$ Z4 X5 l. ]$ ^5 X$ d/ E- z
' |8 v5 m( @* k/ s/ o  B
3 {2 M2 S$ y1 w5 Z, r% \1 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 12:18 , Processed in 0.044577 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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